rng_util 0.2.0

A small wrapper for some Rng implementation details so they can be abstracted away from threes_simulator and threes_solver
Documentation
pub use rand::seq::{IndexedRandom, IteratorRandom, SliceRandom};
pub use rand::{Rng, RngCore, SeedableRng};

pub type RngType = rand_xoshiro::Xoshiro256PlusPlus;

pub fn rng_from_seed(seed: u64) -> RngType {
    RngType::seed_from_u64(seed)
}

pub fn seed_from_entropy() -> u64 {
    rand::rng().random()
}

pub fn initialize_rng(seed: Option<u64>) -> (RngType, u64) {
    let seed = if let Some(val) = seed {
        println!("Using user-provided seed: {val}");
        val
    } else {
        let seed = seed_from_entropy();
        println!("Generated random seed: {seed}");
        seed
    };

    (rng_from_seed(seed), seed)
}

pub fn derive_worker_rng(master: &RngType, worker_index: usize) -> RngType {
    let mut worker = master.clone();
    for _ in 0..worker_index {
        worker.jump();
    }
    worker
}

pub fn test_rng() -> RngType {
    rng_from_seed(0)
}