Skip to main content

rmath/rand/
mod.rs

1//! the rand mod provide the generation of random number and random seed 
2//! 
3//! # Examples
4//! 
5//! ```Rust
6//! use rmath::rand::{DefaultSeed, DefaultRand, Seed, CryptoRand, IterSource};
7//! let s = DefaultSeed::<u32>::new().unwrap();
8//! let s64 = DefaultSeed::<u64>::new().unwrap();
9//! println!("{:#x}", s.seed().unwrap());
10//! println!("{:#x}", s64.seed().unwrap());
11//! let mut rander = DefaultRand::new(&s).unwrap();
12//! let mut rander_64 = DefaultRand::new(&s64).unwrap();
13//! let mut lcr0 = rmath::minstd_rand0!(s).unwrap();
14//! let mut lcr = rmath::minstd_rand!(s).unwrap();
15//! let mut mtr= rmath::mt19937!(s).unwrap();
16//! let mut mtr_64 = rmath::mt19937_64!(s64).unwrap();
17//! let mut lfr = rmath::ranlux24_base!(s).unwrap();
18//! let mut lfr_64 = rmath::ranlux48_base!(s64).unwrap();
19//! let mut crypto_rand = CryptoRand::new(&s).unwrap();
20//! let mut crypto_rand_64 = CryptoRand::new(&s64).unwrap();
21//! println!("======================================================");
22//! let dr_itr = rander.iter_mut();
23//! dr_itr.take(10).for_each(|x| {
24//!     println!("{:#x}", x);
25//! });
26//! println!("======================================================");
27//! let dr_itr = rander_64.iter_mut();
28//! dr_itr.take(10).for_each(|x| {
29//!     println!("{:#x}", x);
30//! });
31//! println!("======================================================");
32//! let dr_itr = lcr0.iter_mut();
33//! dr_itr.take(10).for_each(|x| {
34//!     println!("{:#x}", x);
35//! });
36//! println!("======================================================");
37//! let dr_itr = lcr.iter_mut();
38//! dr_itr.take(10).for_each(|x| {
39//!     println!("{:#x}", x);
40//! });
41//! println!("======================================================");
42//! let dr_itr = mtr.iter_mut();
43//! dr_itr.take(10).for_each(|x| {
44//!     println!("{:#x}", x);
45//! });
46//! println!("======================================================");
47//! let dr_itr = mtr_64.iter_mut();
48//! dr_itr.take(10).for_each(|x| {
49//!     println!("{:#x}", x);
50//! });
51//! println!("======================================================");
52//! let dr_itr = lfr_64.iter_mut();
53//! dr_itr.take(10).for_each(|x| {
54//!     println!("{:#x}", x);
55//! });
56//! println!("======================================================");
57//! let dr_itr = lfr.iter_mut();
58//! dr_itr.take(10).for_each(|x| {
59//!     println!("{:#x}", x);
60//! });
61//! println!("======================================================");
62//! let dr_itr = crypto_rand.iter_mut();
63//! dr_itr.take(10).for_each(|x| {
64//!     println!("{:#x}", x);
65//! });
66//! println!("======================================================");
67//! let dr_itr = crypto_rand_64.iter_mut();
68//! dr_itr.take(10).for_each(|x| {
69//!     println!("{:#x}", x);
70//! });
71//! ```
72
73mod rand_error;
74pub use rand_error::{RandError, RandErrKind};
75pub type Result<T> = std::result::Result<T, RandError>;
76
77pub trait PrimitiveType {
78    fn bits_len() -> Self;
79    fn mask(&self) -> Self;
80}
81
82impl PrimitiveType for u32 {
83    fn bits_len() -> Self {
84        (std::mem::size_of::<u32>() << 3) as u32
85    }
86
87    fn mask(&self) -> Self {
88        if self == &32 {core::u32::MAX} else {(1 << (self & 31)) - 1}
89    }
90}
91
92impl PrimitiveType for usize {
93    fn bits_len() -> Self {
94        (std::mem::size_of::<usize>() << 3) as usize 
95    }
96
97    fn mask(&self) -> Self {
98        if self == &Self::bits_len() {core::usize::MAX} else {(1 << (self & (Self::bits_len() - 1))) - 1}
99    }
100}
101impl PrimitiveType for u64 {
102    fn bits_len() -> Self {
103        (std::mem::size_of::<u64>() << 3) as u64
104    }
105
106    fn mask(&self) -> Self {
107        if self == &64 {core::u64::MAX} else {(1 << (self & 63)) - 1}
108    }
109}
110
111pub trait Seed<T: PrimitiveType> {
112    fn seed(&self) -> Result<T>;
113}
114
115pub trait Source<T: PrimitiveType> {
116    fn gen(& mut self) -> Result<T>;
117    
118    fn reset<Sd: Seed<T>>(&mut self, sd: &Sd) -> Result<()>;
119}
120
121pub trait IterSource<T: PrimitiveType>: Source<T> {
122    fn iter_mut(&mut self) -> crate::rand::iter::Iter<'_, Self, T>
123        where Self: std::marker::Sized;
124}
125
126#[macro_use]
127mod iter;
128pub use iter::Iter;
129
130#[macro_use]
131mod linear_congruential_rand;
132pub use linear_congruential_rand::LinearCongruentialRand;
133iter_impl!(LinearCongruentialRand, u32, usize, u64);
134
135#[macro_use]
136mod mersenne_twister_rand;
137pub use mersenne_twister_rand::MersenneTwisterRand;
138iter_impl!(MersenneTwisterRand, u32, usize, u64);
139
140#[macro_use]
141mod lagged_fibonacci_rand;
142pub use lagged_fibonacci_rand::LaggedFibonacciRand;
143iter_impl!(LaggedFibonacciRand, u32, usize, u64);
144
145#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
146mod default_seed;
147#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
148pub use default_seed::DefaultSeed;
149#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
150mod default_seed_amd64;
151#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
152pub use default_seed_amd64::DefaultSeed;
153
154
155#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
156mod default_rand;
157#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
158pub use default_rand::DefaultRand;
159#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
160mod default_rand_amd64;
161#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
162pub use default_rand_amd64::DefaultRand;
163iter_impl!(DefaultRand, u32, usize, u64);
164
165
166#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
167mod crypto_rand;
168#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
169pub use crypto_rand::CryptoRand;
170
171#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
172mod crypto_rand_amd64;
173#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
174pub use crypto_rand_amd64::CryptoRand;
175iter_impl!(CryptoRand, u32, usize, u64);