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}