mirror of
https://github.com/sot-tech/mochi.git
synced 2026-04-27 08:00:00 -07:00
* migrate torrentapproval to list storage * add initial support for torrent file storage (watch directory with fsnotify) * replace frontend/http/bencode package with github.com/zeebo/bencode module * sanitize code (fix warnings) TODO: * parse torrent files to get hashes, * watch directory event types DON'T use for now
29 lines
770 B
Go
29 lines
770 B
Go
// Package random implements the XORShift PRNG and a way to derive random state
|
|
// from an AnnounceRequest.
|
|
package random
|
|
|
|
// GenerateAndAdvance applies XORShift128Plus on s0 and s1, returning
|
|
// the new states newS0, newS1 and a pseudo-random number v.
|
|
func GenerateAndAdvance(s0, s1 uint64) (v, newS0, newS1 uint64) {
|
|
v = s0 + s1
|
|
newS0 = s1
|
|
s0 ^= s0 << 23
|
|
newS1 = s0 ^ s1 ^ (s0 >> 18) ^ (s1 >> 5)
|
|
return
|
|
}
|
|
|
|
// Intn generates an int k that satisfies k >= 0 && k < n.
|
|
// n must be > 0.
|
|
// It returns the generated k and the new state of the generator.
|
|
func Intn(s0, s1 uint64, n int) (int, uint64, uint64) {
|
|
if n <= 0 {
|
|
panic("invalid n <= 0")
|
|
}
|
|
v, newS0, newS1 := GenerateAndAdvance(s0, s1)
|
|
k := int(v)
|
|
if k < 0 {
|
|
k = -k
|
|
}
|
|
return k % n, newS0, newS1
|
|
}
|