Seeding db2's RAND function
Most computers cannot generate truly random numbers. For this reason, many computer programming languages include pseudo-random number generators. These pseudo-random generators usually need to be seeded so that they don't always reproduce the same sequence of numbers.
The most common approach to seeding the generator, is to do so once per execution / session - ether manually (eg C/C++),
via a constructor (eg Java), or automatically (eg JavaScript/ECMAScript). However, IBM's db2 allows the programmer to
optionally seed the generator each time the RAND
function is called, and not in any other way.
So, given that the common approach mentioned above is a good ballance between efficiency and randomness, I have written
a really simple RANDOMIZE
stored procedure for db2 that can be called once per session to increase the probability
that each session will receive a unique sequence of psuedo-random numbers. And here it is:
CREATE PROCEDURE randomize ( )
DYNAMIC RESULT SETS 0
READS SQL DATA
NOT DETERMINISTIC
LANGUAGE SQL
NO EXTERNAL ACTION
BEGIN
DECLARE time TIMESTAMP;
DECLARE seed BIGINT;
DECLARE ignored DOUBLE;
SET time = CURRENT_TIMESTAMP;
SET seed = ( BIGINT(MINUTE(time) ) * 60 + SECOND(time) ) * 1000000 + MICROSECOND(time);
SET ignored = RAND(INTEGER(MOD(seed,2147483648)));
END
There's really nothing fancy about this stored procedure... it simply uses the current time (with microsecond accuracy) to seed db2's psuedo-random number generator. So a typical use might look something like this:
...
CALL RANDOMIZE();
...
SET random_number_1 = RAND();
SET random_number_2 = RAND();
...
SET random_number_n = RAND();
...
Very simple :)