Split random number generation out into core/random.c, and create the
[people/xl0/gpxe.git] / src / core / random.c
1 /** @file
2  *
3  * Random number generation
4  *
5  */
6
7 #include <stdlib.h>
8
9 static int32_t rnd_seed = 0;
10
11 /**
12  * Seed the pseudo-random number generator
13  *
14  * @v seed              Seed value
15  */
16 void srandom ( unsigned int seed ) {
17         rnd_seed = seed;
18 }
19
20 /**
21  * Generate a pseudo-random number between 0 and 2147483647L or 2147483562?
22  *
23  * @ret rand            Pseudo-random number
24  */
25 long int random ( void ) {
26         int32_t q;
27
28         if ( ! rnd_seed ) /* Initialize linear congruential generator */
29                 srandom ( currticks() );
30
31         /* simplified version of the LCG given in Bruce Schneier's
32            "Applied Cryptography" */
33         q = ( rnd_seed / 53668 );
34         rnd_seed = ( 40014 * ( rnd_seed - 53668 * q ) - 12211 * q );
35         if ( rnd_seed < 0 )
36                 rnd_seed += 2147483563L;
37         return rnd_seed;
38 }