use randomize::*;
use std::io::*;
pub fn main() {
match std::env::args().nth(1).expect("must specify a generator!").as_ref() {
"lcg64_xsh_rr_64_32" => {
let mut gen = PCGPickU64::from(u64_from_time());
runner(|| gen.next_u32())
}
"lcg64_xsh_rs_64_32" => {
let mut gen = PCGPickU64::from(u64_from_time());
runner(|| gen.next_u32shift())
}
"lcg64_xsl_rr_64_32" => {
let mut gen = PCGPickU64::from(u64_from_time());
runner(|| gen.next_u32xslrr())
}
unknown => panic!("Unknown generator: {:?}", unknown),
};
}
pub fn u64_from_time() -> u64 {
use std::time::{SystemTime, UNIX_EPOCH};
let unix_delta = match SystemTime::now().duration_since(UNIX_EPOCH) {
Ok(duration) => duration,
Err(system_time_error) => system_time_error.duration(),
};
if unix_delta.subsec_nanos() != 0 {
unix_delta.as_secs().wrapping_mul(unix_delta.subsec_nanos() as u64)
} else {
unix_delta.as_secs()
}
}
pub fn runner<F: FnMut() -> u32>(mut f: F) {
const BYTE_BUFFER_LENGTH: usize = 64;
const U32_COUNT: usize = BYTE_BUFFER_LENGTH / core::mem::size_of::<u32>();
let mut buf: [u32; U32_COUNT] = [0; U32_COUNT];
let stdout: Stdout = std::io::stdout();
let mut lock: StdoutLock = stdout.lock();
loop {
for buf_mut in buf.iter_mut() {
*buf_mut = f();
}
lock
.write_all(unsafe { std::slice::from_raw_parts(buf.as_ptr() as *const u8, BYTE_BUFFER_LENGTH) })
.unwrap();
}
}