HP OpenVMS Systemsask the wizard |
The Question is: rand() function callable by C or FORTRAN. Has the random number generator embedded within OpenVMS ever been certified by an independednt organization? If so, who? Question is asked because of a proposal our company is responding to. The customer requires independent certification of any RNG employed. Thanks! The Answer is : The underlying (pseudo) random number generator for most random-number requests MTH$RANDOM. It uses a mixed congruential algorithm: Seed = (69069 * seed +1) MOD 2**32 This algorithm is as described in the literature, most notably in Knuth "The Art of Computer Programming", Volume 2 "Seminumerical Algortithms" The choice of multiplier is taken from "Random Number Generation" by G. Marsaglia in: Encyclopedia of Computer Science (pp. 1192-1197) edited by Anthony Ralston, Petrocelli (New York, 1976) As with all algorithms, this method is a compromise between speed of execution and the quality of the generated pseudo random sequences. There are numerous papers in the literature which perform deep statistical analysis of various choices of algorithm. This particular choice has stood the test of time and remains the best choice in its class for a general purpose uniform distribution generator. It's very fast and produces quite good sequences of numbers. A Google search for "MTH$RANDOM" finds plenty of references. A full literature search may find more (academic statisticians love to pick holes in commercial random number generators). There are some applications which require "better" random sequences ("better" defined as passing more stringent statistical tests of randomness). There are algorithms which satisfy these critera, but they require more computation, and are therefore slower. If you have a special requirement for pseudo random number generation, you should replace the standard generator. There are huge numbers of algorithms available either commercially or published in the literature. It's just a matter of selecting one that satisfies your exact needs. Specifically with the C rand() function, the algorithm is documented as: static unsigned int next = 1; int rand(void) { next = next * 1103515245 + 12345; return (next & RAND_MAX); } The actual implementation of rand() is slightly complicated, given the need for reentrancy.
|