Pseudo-random numbers/PCG32: Difference between revisions

→‎{{header|Python}}: Add generator version.
m (Add link)
(→‎{{header|Python}}: Add generator version.)
Line 909:
 
=={{header|Python}}==
 
===Python: As class===
<lang python>mask64 = (1 << 64) - 1
mask32 = (1 << 32) - 1
Line 955 ⟶ 957:
for i in range(100_000):
hist[int(random_gen.next_float() *5)] += 1
print(hist)</lang>
 
{{out}}
<pre>2707161783
2068313097
3122475824
2211639955
3215226955
{0: 20049, 1: 20022, 2: 20115, 3: 19809, 4: 20005}</pre>
 
===Python: As generator===
(Must divide int by 1 << 32 to get float values).
 
<lang python>mask64 = (1 << 64) - 1
mask32 = (1 << 32) - 1
CONST = 6364136223846793005
 
 
def pcg32(seed_state=None, seed_sequence=None):
def next_int():
"return random 32 bit unsigned int"
nonlocal state, inc
 
state, xorshifted, rot = (((state * CONST) + inc) & mask64,
(((state >> 18) ^ state) >> 27) & mask32,
(state >> 59) & mask32)
answer = (((xorshifted >> rot) | (xorshifted << ((-rot) & 31)))
& mask32)
return answer
 
# Seed
state = inc = 0
if all(type(x) == int for x in (seed_state, seed_sequence)):
inc = ((seed_sequence << 1) | 1) & mask64
next_int()
state += seed_state
next_int()
 
while True:
yield next_int()
 
 
if __name__ == '__main__':
from itertools import islice
 
for i in islice(pcg32(42, 54), 5):
print(i)
hist = {i:0 for i in range(5)}
for i in islice(pcg32(987654321, 1), 100_000):
hist[int(i / (1 << 32) * 5)] += 1
print(hist)</lang>
 
Anonymous user