deep_causality_rand/
lib.rs

1/*
2 * SPDX-License-Identifier: MIT
3 * Copyright (c) "2025" . The DeepCausality Authors and Contributors. All Rights Reserved.
4 */
5
6mod errors;
7mod extensions;
8mod traits;
9pub mod types;
10mod utils;
11
12// Errors
13pub use crate::errors::bernoulli_error::BernoulliDistributionError;
14pub use crate::errors::normal_error::NormalDistributionError;
15pub use crate::errors::rng_error::RngError;
16pub use crate::errors::uniform_error::UniformDistributionError;
17// Extensions
18
19// Traits
20pub use crate::traits::distribution::Distribution;
21pub use crate::traits::fill::Fill;
22pub use crate::traits::rng::Rng;
23pub use crate::traits::rng_core::RngCore;
24pub use crate::traits::sample_borrow::SampleBorrow;
25pub use crate::traits::sample_range::SampleRange;
26pub use crate::traits::sample_uniform::{SampleUniform, UniformSampler};
27// Types
28pub use crate::types::distr::bernoulli::Bernoulli;
29pub use crate::types::distr::normal::Normal;
30pub use crate::types::distr::normal::standard_normal::StandardNormal;
31pub use crate::types::distr::uniform::standard_uniform::StandardUniform;
32pub use crate::types::distr::uniform::{Uniform, UniformFloat};
33pub use crate::types::misc::iter::Iter;
34pub use crate::types::misc::map::Map;
35pub use crate::types::range::{Open01, OpenClosed01};
36
37#[cfg(not(feature = "os-random"))]
38use crate::types::Xoshiro256;
39#[cfg(not(feature = "os-random"))]
40use std::cell::RefCell;
41
42#[cfg(feature = "os-random")]
43use crate::types::rand::os_random_rng::OsRandomRng;
44
45#[cfg(not(feature = "os-random"))]
46thread_local! {
47    static THREAD_RNG: RefCell<Xoshiro256> = RefCell::new(Xoshiro256::new());
48}
49
50#[cfg(not(feature = "os-random"))]
51pub struct ThreadRng;
52
53#[cfg(not(feature = "os-random"))]
54impl RngCore for ThreadRng {
55    fn next_u32(&mut self) -> u32 {
56        THREAD_RNG.with(|rng| rng.borrow_mut().next_u32())
57    }
58    fn next_u64(&mut self) -> u64 {
59        THREAD_RNG.with(|rng| rng.borrow_mut().next_u64())
60    }
61    fn fill_bytes(&mut self, dest: &mut [u8]) {
62        THREAD_RNG.with(|rng| rng.borrow_mut().fill_bytes(dest))
63    }
64}
65
66#[cfg(not(feature = "os-random"))]
67impl Rng for ThreadRng {}
68
69/// Returns a new random number generator.
70///
71/// By default, this returns a `SipHash13Rng`. If the `os-random` feature is enabled,
72/// it returns an `OsRandomRng`.
73pub fn rng() -> impl Rng {
74    #[cfg(feature = "os-random")]
75    {
76        OsRandomRng::new().expect("Failed to create OsRandomRng")
77    }
78    #[cfg(not(feature = "os-random"))]
79    {
80        ThreadRng
81    }
82}