mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-12 01:47:38 +00:00
29 lines
655 B
Rust
29 lines
655 B
Rust
![]() |
/// XorShiftRng
|
||
|
pub struct DeterministicRng {
|
||
|
count: usize,
|
||
|
x: u32,
|
||
|
y: u32,
|
||
|
z: u32,
|
||
|
w: u32,
|
||
|
}
|
||
|
|
||
|
impl DeterministicRng {
|
||
|
pub fn new() -> Self {
|
||
|
DeterministicRng { count: 0, x: 0x193a6754, y: 0xa8a7d469, z: 0x97830e05, w: 0x113ba7bb }
|
||
|
}
|
||
|
|
||
|
/// Guarantees that each returned number is unique.
|
||
|
pub fn next(&mut self) -> u32 {
|
||
|
self.count += 1;
|
||
|
assert!(self.count <= 70029);
|
||
|
let x = self.x;
|
||
|
let t = x ^ (x << 11);
|
||
|
self.x = self.y;
|
||
|
self.y = self.z;
|
||
|
self.z = self.w;
|
||
|
let w_ = self.w;
|
||
|
self.w = w_ ^ (w_ >> 19) ^ (t ^ (t >> 8));
|
||
|
self.w
|
||
|
}
|
||
|
}
|