arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/sampling/src/source.rs
sampling/src/source.rsRaw
 1use rand_chacha::rand_core::SeedableRng;
 2use rand_core::RngCore;
 3use rand_chacha::{ChaCha8Rng};
 4
 5const MAXF64: f64 = 9007199254740992.0;
 6
 7pub struct Source{
 8    source:ChaCha8Rng,
 9}
10
11impl Source{
12    pub fn new(seed: [u8;32]) -> Source{
13        Source{source:ChaCha8Rng::from_seed(seed)}
14    }
15
16    pub fn new_seed(&mut self) -> [u8;32]{
17        let mut seed: [u8; 32] = [0u8;32];
18        self.source.fill_bytes(&mut seed);
19        seed
20    }
21
22    #[inline(always)]
23    pub fn next_u64(&mut self) -> u64{
24        self.source.next_u64()
25    }
26
27    #[inline(always)]
28    pub fn next_u64n(&mut self, max: u64, mask: u64) -> u64{
29        let mut x: u64 = self.next_u64() & mask;
30        while x >= max{
31            x = self.next_u64() & mask;
32        }
33        x
34    }
35
36    #[inline(always)]
37    pub fn next_f64(&mut self, min: f64, max: f64) -> f64{
38        min + ((self.next_u64()<<11>>11) as f64)/MAXF64 * (max-min)
39    }
40
41    #[inline(always)]
42    pub fn fill_bytes(&mut self, bytes: &mut [u8]){
43        self.source.fill_bytes(bytes)
44    }
45}