import Base # --- Counter-based RNG v0: splitmix32. Stateless, hence parallel-perfect: # stream i is rng_next(seed + i), no shared state to thread through. # Decimals: 0x9E3779B9, 0x21F0AAAD, 0x735A2D97. def rng_step1(z: U32) -> U32: U32.add(z, 2654435769) def rng_step2(+z: U32) -> U32: U32.mul(U32.xor(z, U32.shrn(z, 16n)), 569420461) def rng_step3(+z: U32) -> U32: U32.mul(U32.xor(z, U32.shrn(z, 15n)), 1935289751) def rng_step4(+z: U32) -> U32: U32.xor(z, U32.shrn(z, 15n)) def rng_next(seed: U32) -> U32: rng_step4(rng_step3(rng_step2(rng_step1(seed)))) def rng01(seed: U32) -> F32: (U32.to_f32(rng_next(seed)) / 4294967296.0 : F32)