Trait rug::rand::RandGen
[−]
[src]
pub trait RandGen: Send + Sync { fn gen(&mut self) -> u32; fn seed(&mut self, _seed: &Integer) { ... } }
Custom random number generator to be used with
RandState
.
Required Methods
Provided Methods
fn seed(&mut self, _seed: &Integer)
Seeds the random number generator.
The default implementation of this function does nothing.
Note that the `RandState::seed() method will pass its seed parameter exactly to this function without using it otherwise.
Examples
use rug::{Assign, Integer}; use rug::rand::{RandGen, RandState}; struct Seed { inner: Integer }; impl RandGen for Seed { fn gen(&mut self) -> u32 { self.inner.to_u32_wrapping() } fn seed(&mut self, seed: &Integer) { self.inner.assign(seed); } } let mut seed = Seed { inner: Integer::from(12) }; let i = Integer::from(12345); { let mut rand = RandState::new_custom(&mut seed); rand.seed(&i); } assert_eq!(seed.inner, i);
If you use unsafe code, you can pass a reference to anything,
or even an isize
or usize
, to the seeding function.
use rug::Integer; use rug::rand::{RandGen, RandState}; struct Seed { num: isize }; impl RandGen for Seed { fn gen(&mut self) -> u32 { 0x8cef7310 } fn seed(&mut self, seed: &Integer) { // cast seed to pointer, then to isize self.num = seed as *const _ as isize; } } let mut seed = Seed { num: 15 }; let i = -12345_isize; { let i_ptr = i as *const Integer; // unsafe code to cast i from isize to &Integer let ir = unsafe { &*i_ptr }; let mut rand = RandState::new_custom(&mut seed); rand.seed(ir); } assert_eq!(seed.num, i);