deep_causality_rand/
lib.rs1mod errors;
7mod extensions;
8mod traits;
9pub mod types;
10mod utils;
11
12pub 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;
17pub 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};
27pub 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
69pub 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}