1 import 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 7 def rng_step1(z: U32) -> U32: 8 U32.add(z, 2654435769) 9 10 def rng_step2(+z: U32) -> U32: 11 U32.mul(U32.xor(z, U32.shrn(z, 16n)), 569420461) 12 13 def rng_step3(+z: U32) -> U32: 14 U32.mul(U32.xor(z, U32.shrn(z, 15n)), 1935289751) 15 16 def rng_step4(+z: U32) -> U32: 17 U32.xor(z, U32.shrn(z, 15n)) 18 19 def rng_next(seed: U32) -> U32: 20 rng_step4(rng_step3(rng_step2(rng_step1(seed)))) 21 22 def rng01(seed: U32) -> F32: 23 (U32.to_f32(rng_next(seed)) / 4294967296.0 : F32)