xref: /plan9/sys/src/ape/lib/v/rand.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #define _RESEARCH_SOURCE
2*3e12c5d1SDavid du Colombier #include <stdlib.h>
3*3e12c5d1SDavid du Colombier #include <libv.h>
4*3e12c5d1SDavid du Colombier /*
5*3e12c5d1SDavid du Colombier 	random number generator from cacm 31 10, oct 88
6*3e12c5d1SDavid du Colombier 	for 32 bit integers (called long here)
7*3e12c5d1SDavid du Colombier */
8*3e12c5d1SDavid du Colombier 
9*3e12c5d1SDavid du Colombier #ifdef	MAIN
10*3e12c5d1SDavid du Colombier #define	A	16807
11*3e12c5d1SDavid du Colombier #define	M	2147483647
12*3e12c5d1SDavid du Colombier #define	Q	127773
13*3e12c5d1SDavid du Colombier #define	R	2836
14*3e12c5d1SDavid du Colombier #else
15*3e12c5d1SDavid du Colombier #define	A	48271
16*3e12c5d1SDavid du Colombier #define	M	2147483647
17*3e12c5d1SDavid du Colombier #define	Q	44488
18*3e12c5d1SDavid du Colombier #define	R	3399
19*3e12c5d1SDavid du Colombier #endif
20*3e12c5d1SDavid du Colombier 
21*3e12c5d1SDavid du Colombier static long seed = 1;
22*3e12c5d1SDavid du Colombier 
23*3e12c5d1SDavid du Colombier void
srand(unsigned int newseed)24*3e12c5d1SDavid du Colombier srand(unsigned int newseed)
25*3e12c5d1SDavid du Colombier {
26*3e12c5d1SDavid du Colombier 	seed = newseed;
27*3e12c5d1SDavid du Colombier }
28*3e12c5d1SDavid du Colombier 
29*3e12c5d1SDavid du Colombier long
lrand(void)30*3e12c5d1SDavid du Colombier lrand(void)
31*3e12c5d1SDavid du Colombier {
32*3e12c5d1SDavid du Colombier 	long lo, hi, test;
33*3e12c5d1SDavid du Colombier 
34*3e12c5d1SDavid du Colombier 	hi = seed/Q;
35*3e12c5d1SDavid du Colombier 	lo = seed%Q;
36*3e12c5d1SDavid du Colombier 	test = A*lo - R*hi;
37*3e12c5d1SDavid du Colombier 	if(test > 0)
38*3e12c5d1SDavid du Colombier 		seed = test;
39*3e12c5d1SDavid du Colombier 	else
40*3e12c5d1SDavid du Colombier 		seed = test+M;
41*3e12c5d1SDavid du Colombier 	return(seed);
42*3e12c5d1SDavid du Colombier }
43*3e12c5d1SDavid du Colombier 
44*3e12c5d1SDavid du Colombier int
rand(void)45*3e12c5d1SDavid du Colombier rand(void)
46*3e12c5d1SDavid du Colombier {
47*3e12c5d1SDavid du Colombier 	return lrand()%(RAND_MAX+1);
48*3e12c5d1SDavid du Colombier }
49*3e12c5d1SDavid du Colombier 
50*3e12c5d1SDavid du Colombier #ifdef	MAIN
51*3e12c5d1SDavid du Colombier 
main()52*3e12c5d1SDavid du Colombier main()
53*3e12c5d1SDavid du Colombier {
54*3e12c5d1SDavid du Colombier 	int i;
55*3e12c5d1SDavid du Colombier 
56*3e12c5d1SDavid du Colombier 	for(i = 0; i < 10000; i++)
57*3e12c5d1SDavid du Colombier 		rand();
58*3e12c5d1SDavid du Colombier 	if(seed == 1043618065)
59*3e12c5d1SDavid du Colombier 		printf("     rand: pass\n");
60*3e12c5d1SDavid du Colombier 	else
61*3e12c5d1SDavid du Colombier 		printf("*****rand: fail; seed=%u, should be 1043618065\n", seed);
62*3e12c5d1SDavid du Colombier 	exit(0);
63*3e12c5d1SDavid du Colombier }
64*3e12c5d1SDavid du Colombier #endif
65