-
Notifications
You must be signed in to change notification settings - Fork 0
/
prng.go
58 lines (44 loc) · 1.16 KB
/
prng.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package randutil
import "math"
// https://gist.github.com/tommyettinger/e6d3e8816da79b45bfe582384c2fe14a
func UniformUint32(z uint32) uint32 {
z = z + 0x6d2b79f5
z = (z ^ (z >> 15)) * (z | 1)
z ^= z + (z^(z>>7))*(z|61)
z ^= z >> 14
return z
}
func UniformInt32Range(seed int64, min, max int32) int32 {
val := UniformUint32(uint32(seed))
diff := math.MaxUint32 / uint32(max-min)
return int32(val/diff) + min
}
func UniformFloat64(seed int64) float64 {
return float64(UniformUint32(uint32(seed))) / math.MaxUint32
}
func NormalUint32(z uint32) uint32 {
in := z + 0x6d2b79f5
z = (in ^ (in >> 15)) * (in | 1)
z ^= z + (z^(z>>7))*(z|61)
z ^= z >> 14
out := uint64(z)
in++
z = (in ^ (in >> 15)) * (in | 1)
z ^= z + (z^(z>>7))*(z|61)
z ^= z >> 14
out += uint64(z)
in -= 2
z = (in ^ (in >> 15)) * (in | 1)
z ^= z + (z^(z>>7))*(z|61)
z ^= z >> 14
out += uint64(z)
return uint32(out / 3)
}
func NormalInt32Range(seed int64, min, max int32) int32 {
val := NormalUint32(uint32(seed))
diff := math.MaxUint32 / uint32(max-min)
return int32(val/diff) + min
}
func NormalFloat64(seed int64) float64 {
return float64(NormalUint32(uint32(seed))) / math.MaxUint32
}