Friday 1 December 2006

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 :)

Paul.

Labels:

1 Comments:

At 9 December 2006 at 8:55:00 am AEDT , Anonymous Anonymous said...

Hey cool. Seems effective. I haven't got any use for it right now, but It could come in handy in the future.
I'm just wondering why you might need to use it in your projects?

Good post though. Keep 'em coming!

-Mike

 

Post a Comment

Subscribe to Post Comments [Atom]

<< Home