1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use core::ops::RangeBounds;

use fastrand::Rng;

use crate::W4RefCell;

static GLOBAL_RNG: W4RefCell<Option<Rng>> = W4RefCell::new(None);

fn initialize() {
    *GLOBAL_RNG.borrow_mut() = Some(Rng::with_seed(123456789));
}

fn ensure_initialized() {
    if GLOBAL_RNG.borrow().is_none() {
        initialize();
    }
}

/// Generate a random u8.
pub fn rand_u8(range: impl RangeBounds<u8>) -> u8 {
    ensure_initialized();
    GLOBAL_RNG.borrow_mut().as_mut().unwrap().u8(range)
}

/// Generate a random i32.
pub fn rand_i32(range: impl RangeBounds<i32>) -> i32 {
    ensure_initialized();
    GLOBAL_RNG.borrow_mut().as_mut().unwrap().i32(range)
}

/// Generate a random f64.
pub fn rand_f64() -> f64 {
    ensure_initialized();
    GLOBAL_RNG.borrow_mut().as_mut().unwrap().f64()
}

/// Reseed the RNG.
pub fn rand_reseed(seed: u64) {
    ensure_initialized();
    GLOBAL_RNG.borrow_mut().as_mut().unwrap().seed(seed)
}