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; +} +  | 
