const PRIME_A: u128 = 1442695040888963407;
const PRIME_B: u128 = 6364136223846793005;
pub struct Rand {
seed: u128,
}
impl Default for Rand {
fn default() -> Self {
Self::new()
}
}
impl Rand {
pub fn new() -> Rand {
let rand_ptr: *const i32 = &123;
Rand {
seed: (rand_ptr as u128).wrapping_mul(
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_nanos(),
),
}
}
#[inline]
pub fn rand(&mut self) -> usize {
self.seed = PRIME_A.wrapping_mul(self.seed).wrapping_add(PRIME_B);
(self.seed >> 32).wrapping_mul(PRIME_A) as usize
}
#[inline]
pub fn rand_bool(&mut self) -> bool {
self.seed = PRIME_A.wrapping_mul(self.seed).wrapping_add(PRIME_B);
(self.seed >> 32) % 2 == 0
}
#[inline]
pub fn rand_usize(&mut self) -> usize {
self.seed = PRIME_A.wrapping_mul(self.seed).wrapping_add(PRIME_B);
(self.seed >> 32).wrapping_mul(PRIME_A) as usize
}
#[inline]
pub fn rand_u8(&mut self) -> u8 {
self.seed = PRIME_A.wrapping_mul(self.seed).wrapping_add(PRIME_B);
(self.seed >> 32) as u8
}
#[inline]
pub fn rand_u16(&mut self) -> u16 {
self.seed = PRIME_A.wrapping_mul(self.seed).wrapping_add(PRIME_B);
(self.seed >> 32) as u16
}
#[inline]
pub fn rand_u32(&mut self) -> u32 {
self.seed = PRIME_A.wrapping_mul(self.seed).wrapping_add(PRIME_B);
(self.seed >> 32) as u32
}
#[inline]
pub fn rand_u64(&mut self) -> u64 {
self.seed = PRIME_A.wrapping_mul(self.seed).wrapping_add(PRIME_B);
(self.seed >> 32).wrapping_mul(PRIME_A) as u64
}
#[inline]
pub fn rand_u128(&mut self) -> u128 {
self.seed = PRIME_A.wrapping_mul(self.seed).wrapping_add(PRIME_B);
((self.seed >> 32) as u128)
.wrapping_mul(PRIME_A as u128)
.wrapping_mul(PRIME_B as u128)
}
#[inline]
pub fn rand_i8(&mut self) -> i8 {
self.seed = PRIME_A.wrapping_mul(self.seed).wrapping_add(PRIME_B);
(self.seed >> 32) as i8
}
#[inline]
pub fn rand_i16(&mut self) -> i16 {
self.seed = PRIME_A.wrapping_mul(self.seed).wrapping_add(PRIME_B);
(self.seed >> 32) as i16
}
#[inline]
pub fn rand_i32(&mut self) -> i32 {
self.seed = PRIME_A.wrapping_mul(self.seed).wrapping_add(PRIME_B);
(self.seed >> 32) as i32
}
#[inline]
pub fn rand_i64(&mut self) -> i64 {
self.seed = PRIME_A.wrapping_mul(self.seed).wrapping_add(PRIME_B);
(self.seed >> 32).wrapping_mul(PRIME_A) as i64
}
#[inline]
pub fn rand_i128(&mut self) -> i128 {
self.seed = PRIME_A.wrapping_mul(self.seed).wrapping_add(PRIME_B);
((self.seed >> 32) as i128)
.wrapping_mul(PRIME_A as i128)
.wrapping_mul(PRIME_B as i128)
}
#[inline]
pub fn rand_range(&mut self, min: usize, max: usize) -> usize {
self.rand() % (max + 1 - min) + min
}
#[inline]
pub fn shuffle_vec<T>(&mut self, vector: &mut Vec<T>) {
let vector_len = vector.len();
for _ in 0..vector_len {
let rand_index1 = self.rand_range(0, vector_len - 1);
let rand_index2 = self.rand_range(0, vector_len - 1);
vector.swap(rand_index1, rand_index2);
}
}
#[inline]
pub fn rand_element<'a, T>(&'a mut self, vector: &'a Vec<T>) -> &T {
&vector[self.rand_range(0, vector.len() - 1)]
}
}