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
pub struct PRNG {
seed: u64,
}
impl PRNG {
pub const fn init(s: u64) -> PRNG {
PRNG { seed: s }
}
#[allow(dead_code)]
pub fn rand(&mut self) -> u64 {
self.rand_change()
}
pub fn sparse_rand(&mut self) -> u64 {
let mut s = self.rand_change();
s &= self.rand_change();
s &= self.rand_change();
s
}
pub fn singular_bit(&mut self) -> u64 {
let num: u64 = 1;
num.wrapping_shl(self.rand().count_ones())
}
fn rand_change(&mut self) -> u64 {
self.seed ^= self.seed >> 12;
self.seed ^= self.seed << 25;
self.seed ^= self.seed >> 27;
self.seed.wrapping_mul(2685_8216_5773_6338_717)
}
}