-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrand_generator.py
78 lines (65 loc) · 2.92 KB
/
rand_generator.py
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
"""
prime modulus multiplicative linear congruential pseudo random number generator
z[i]=(630360016*z[i-1]) (mod(pow(2,31)-1)), based on Marse Roberts
multiple 100 streams are supported, with seeds spaced 100000 apart
usage
1. to obtain the next U(0,1) random number from stream, execute
u=rand(stream), where rand is a double function
the double variable u will contain the next random number
2. to set the seed for stream to desired value zset, execute
randst(zset, stream)
where zset must be an integer to the desired seed,
a number between 1 and 2147483646 [inclusive]
3. to get the current, most recently used, integer in the sequence being generated for stream
into the int variable zget, execute
zget=randgt(stream)
where randgt is a int function
"""
#default seeds for all 100 streams
zrng=[1973272912, 281629770, 20006270, 1280689831, 2096730329, 1933576050,
913566091, 246780520, 1363774876, 604901985, 1511192140, 1259851944,
824064364, 150493284, 242708531, 75253171, 1964472944, 1202299975,
233217322, 1911216000, 726370533, 403498145, 993232223, 1103205531,
762430696, 1922803170, 1385516923, 76271663, 413682397, 726466604,
336157058, 1432650381, 1120463904, 595778810, 877722890, 1046574445,
68911991, 2088367019, 748545416, 622401386, 2122378830, 640690903,
1774806513, 2132545692, 2079249579, 78130110, 852776735, 1187867272,
1351423507, 1645973084, 1997049139, 922510944, 2045512870, 898585771,
243649545, 1004818771, 773686062, 403188473, 372279877, 1901633463,
498067494, 2087759558, 493157915, 597104727, 1530940798, 1814496276,
536444882, 1663153658, 855503735, 67784357, 1432404475, 619691088,
119025595, 880802310, 176192644, 1116780070, 277854671, 1366580350,
1142483975, 2026948561, 1053920743, 786262391, 1792203830, 1494667770,
1923011392, 1433700034, 1244184613, 1147297105, 539712780, 1545929719,
190641742, 1645390429, 264907697, 620389253, 1502074852, 927711160,
364849192, 2049576050, 638580085, 547070247]
#the magic constants
modlus =2147483647
mult1 =24112
mult2 =26143
#generate the next random number
def rand(stream):
zi=zrng[stream]
lowprd=(zi&65535)*mult1
hi=(zi>>16)*mult1+(lowprd>>16)
zi=((lowprd&65535)-modlus)+((hi&32767)<<16)+(hi>>15)
if (zi<0):
zi+=modlus
lowprd=(zi&65535)*mult2
hi=(zi>>16)*mult2+(lowprd>>16)
zi=((lowprd&65535)-modlus)+((hi&32767)<<16)+(hi>>15)
if (zi<0):
zi+=modlus
zrng[stream]=zi
return ((zi>>7|1)+1)/16777216.0
#set the current zrng for stream to zset
def randst(zset, stream):
zrng[stream]=zset
#return the current zrng for stream
def randgt(stream):
return zrng[stream]
"""
#validate...
seed=1
print (rand(seed))
"""