/* SPDX-License-Identifier: MIT * * Phobos */ package phobos import ( "crypto/rand" "encoding/binary" ) type rng32 uint32 func newRNG32() rng32 { var seed [4]byte rand.Read(seed[:]) state := binary.LittleEndian.Uint32(seed[:]) if state == 0 { state = 1 } return rng32(state) } func (r *rng32) next() uint32 { x := uint32(*r) x ^= x << 13 x ^= x >> 17 x ^= x << 5 *r = rng32(x) return x } func (r *rng32) below(n int) int { if n <= 1 { return 0 } return int(r.next() % uint32(n)) } func (r *rng32) fill(p []byte) { for len(p) >= 4 { binary.LittleEndian.PutUint32(p, r.next()) p = p[4:] } if len(p) > 0 { v := r.next() for i := range p { p[i] = byte(v >> (i * 8)) } } }