summaryrefslogtreecommitdiff
path: root/sys/src/ape/lib/v/rand.c
blob: 4996b0c2683ce234bfd8ed2eb04dde5d51c17d7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#define _RESEARCH_SOURCE
#include <stdlib.h>
#include <libv.h>
/*
	random number generator from cacm 31 10, oct 88
	for 32 bit integers (called long here)
*/

#ifdef	MAIN
#define	A	16807
#define	M	2147483647
#define	Q	127773
#define	R	2836
#else
#define	A	48271
#define	M	2147483647
#define	Q	44488
#define	R	3399
#endif

static long seed = 1;

void
srand(unsigned int newseed)
{
	seed = newseed;
}

long
lrand(void)
{
	long lo, hi, test;

	hi = seed/Q;
	lo = seed%Q;
	test = A*lo - R*hi;
	if(test > 0)
		seed = test;
	else
		seed = test+M;
	return(seed);
}

int
rand(void)
{
	return lrand()%(RAND_MAX+1);
}

#ifdef	MAIN

main()
{
	int i;

	for(i = 0; i < 10000; i++)
		rand();
	if(seed == 1043618065)
		printf("     rand: pass\n");
	else
		printf("*****rand: fail; seed=%u, should be 1043618065\n", seed);
	exit(0);
}
#endif