rng.bend

bend-prot@0.1.0.0 · 23 lines · 6 definitions

1import Base
2
3# --- Counter-based RNG v0: splitmix32. Stateless, hence parallel-perfect:
4# stream i is rng_next(seed + i), no shared state to thread through.
5# Decimals: 0x9E3779B9, 0x21F0AAAD, 0x735A2D97.
6
7def rng_step1(z: U32) -> U32:
8  U32.add(z, 2654435769)
9
10def rng_step2(+z: U32) -> U32:
11  U32.mul(U32.xor(z, U32.shrn(z, 16n)), 569420461)
12
13def rng_step3(+z: U32) -> U32:
14  U32.mul(U32.xor(z, U32.shrn(z, 15n)), 1935289751)
15
16def rng_step4(+z: U32) -> U32:
17  U32.xor(z, U32.shrn(z, 15n))
18
19def rng_next(seed: U32) -> U32:
20  rng_step4(rng_step3(rng_step2(rng_step1(seed))))
21
22def rng01(seed: U32) -> F32:
23  (U32.to_f32(rng_next(seed)) / 4294967296.0 : F32)