diff options
Diffstat (limited to 'libc/stdlib/random.c')
-rw-r--r-- | libc/stdlib/random.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/libc/stdlib/random.c b/libc/stdlib/random.c new file mode 100644 index 000000000..c040ce455 --- /dev/null +++ b/libc/stdlib/random.c @@ -0,0 +1,36 @@ +#include <stdlib.h> + +/* + * This generator is a combination of three linear congruential generators + * with periods or 2^15-405, 2^15-1041 and 2^15-1111. It has a period that + * is the product of these three numbers. + */ + +static long int seed1 = 1; +static long int seed2 = 1; +static long int seed3 = 1; + +#define CRANK(a,b,c,m,s) \ + q = s/a; \ + s = b*(s-a*q) - c*q; \ + if(s<0) s+=m; + +long int random() +{ + register long int q; + + CRANK(206, 157, 31, 32363, seed1); + CRANK(217, 146, 45, 31727, seed2); + CRANK(222, 142, 133, 31657, seed3); + + return seed1 ^ seed2 ^ seed3; +} + +void srandom(unsigned int seed) +{ + seed &= RAND_MAX; + seed1 = seed % 32362 + 1; + seed2 = seed % 31726 + 1; + seed3 = seed % 31656 + 1; +} + |