[go: up one dir, main page]

randomize 2.2.0

A dead simple to use randomization library for rust.
Documentation
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) {
  // arbitrary selection of one cache line at a time
  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();
  }
}