Ground-Zerro / Phobos Public
Code Issues Pull requests Actions Releases View on GitHub ↗
716 B go
/* 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))
		}
	}
}