xref: /inferno-os/appl/lib/rand.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Rand;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "rand.m";
4*37da2899SCharles.Forsyth
5*37da2899SCharles.Forsythrsalt: big;
6*37da2899SCharles.Forsyth
7*37da2899SCharles.Forsythinit(seed: int)
8*37da2899SCharles.Forsyth{
9*37da2899SCharles.Forsyth	rsalt = big seed;
10*37da2899SCharles.Forsyth}
11*37da2899SCharles.Forsyth
12*37da2899SCharles.ForsythMASK: con (big 1<<63)-(big 1);
13*37da2899SCharles.Forsyth
14*37da2899SCharles.Forsythrand(modulus: int): int
15*37da2899SCharles.Forsyth{
16*37da2899SCharles.Forsyth	rsalt = rsalt * big 1103515245 + big 12345;
17*37da2899SCharles.Forsyth	if(modulus <= 0)
18*37da2899SCharles.Forsyth		return 0;
19*37da2899SCharles.Forsyth	return int (((rsalt&MASK)>>10) % big modulus);
20*37da2899SCharles.Forsyth}
21*37da2899SCharles.Forsyth
22*37da2899SCharles.Forsyth# 0 < modulus < 2^53
23*37da2899SCharles.Forsythbigrand(modulus: big): big
24*37da2899SCharles.Forsyth{
25*37da2899SCharles.Forsyth	rsalt = rsalt * big 1103515245 + big 12345;
26*37da2899SCharles.Forsyth	if(modulus <= big 0)
27*37da2899SCharles.Forsyth		return big 0;
28*37da2899SCharles.Forsyth	return ((rsalt&MASK)>>10) % modulus;
29*37da2899SCharles.Forsyth}
30