rust/lfprng/src/lib.rs
changeset 14027 cef0c685fda8
parent 13935 75eaf7c71789
child 14029 259175ab7e8c
equal deleted inserted replaced
14026:3b3d97ed2286 14027:cef0c685fda8
     2     circular_buffer: [u32; 64],
     2     circular_buffer: [u32; 64],
     3     index: usize,
     3     index: usize,
     4 }
     4 }
     5 
     5 
     6 impl LaggedFibonacciPRNG {
     6 impl LaggedFibonacciPRNG {
     7     fn new(init_values: &[u8]) -> Self {
     7     pub fn new(init_values: &[u8]) -> Self {
     8         let mut buf = [0xa98765 + 68; 64];
     8         let mut buf = [0xa98765 + 68; 64];
     9 
     9 
    10         for i in 0..std::cmp::min(init_values.len(), 54) {
    10         for i in 0..std::cmp::min(init_values.len(), 54) {
    11             buf[i] = init_values[i] as u32;
    11             buf[i] = init_values[i] as u32;
    12         }
    12         }
    22 
    22 
    23         prng
    23         prng
    24     }
    24     }
    25 
    25 
    26     #[inline]
    26     #[inline]
    27     fn get_next(&mut self) -> u32 {
    27     pub fn get_next(&mut self) -> u32 {
    28         self.index = (self.index + 1) & 0x3f;
    28         self.index = (self.index + 1) & 0x3f;
    29         self.circular_buffer[self.index] = (self.circular_buffer[(self.index + 40) & 0x3f]
    29         self.circular_buffer[self.index] = (self.circular_buffer[(self.index + 40) & 0x3f]
    30             + self.circular_buffer[(self.index + 9) & 0x3f])
    30             + self.circular_buffer[(self.index + 9) & 0x3f])
    31             & 0x7fffffff;
    31             & 0x7fffffff;
    32 
    32 
    33         self.circular_buffer[self.index]
    33         self.circular_buffer[self.index]
    34     }
    34     }
    35 
    35 
    36     #[inline]
    36     #[inline]
    37     fn get_random(&mut self, modulo: u32) -> u32 {
    37     pub fn get_random(&mut self, modulo: u32) -> u32 {
    38         self.get_next();
    38         self.get_next();
    39         self.get_next() % modulo
    39         self.get_next() % modulo
    40     }
    40     }
    41 
    41 
    42     #[inline]
    42     #[inline]
    43     fn add_randomness(&mut self, value: u32) {
    43     pub fn add_randomness(&mut self, value: u32) {
    44         self.index = (self.index + 1) & 0x3f;
    44         self.index = (self.index + 1) & 0x3f;
    45         self.circular_buffer[self.index] ^= value;
    45         self.circular_buffer[self.index] ^= value;
    46     }
    46     }
    47 }
    47 }
    48 
    48