gpu_rand/
default.rs

1use crate::xoroshiro::Xoroshiro128StarStar;
2use rand_core::{RngCore, SeedableRng};
3
4/// Default random generator which is good for most applications.
5///
6/// This currently uses [`Xoroshiro128StarStar`], but that may be changed in the future (with a major version bump).
7#[cfg_attr(not(target_os = "cuda"), derive(Copy, cust_core::DeviceCopy))]
8#[derive(Debug, Clone, PartialEq, Eq)]
9#[repr(transparent)]
10pub struct DefaultRand {
11    inner: Xoroshiro128StarStar,
12}
13
14impl DefaultRand {
15    /// Initializes many states such that each state is offset in the main sequence by at least
16    /// `2**64` elements (based on the current default generator). Such that every state is independent
17    /// from the others as long as no state requests more than `2**64` random numbers.
18    #[cfg_attr(docsrs, doc(cfg(not(target_os = "cuda"))))]
19    #[cfg(not(target_os = "cuda"))]
20    pub fn initialize_states(seed: u64, num_states: usize) -> Vec<Self> {
21        Xoroshiro128StarStar::initialize_states(seed, num_states)
22            .into_iter()
23            .map(|inner| Self { inner })
24            .collect()
25    }
26}
27
28impl RngCore for DefaultRand {
29    fn next_u32(&mut self) -> u32 {
30        self.inner.next_u32()
31    }
32
33    fn next_u64(&mut self) -> u64 {
34        self.inner.next_u64()
35    }
36
37    fn fill_bytes(&mut self, dest: &mut [u8]) {
38        self.inner.fill_bytes(dest)
39    }
40
41    fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand_core::Error> {
42        self.inner.try_fill_bytes(dest)
43    }
44}
45
46impl SeedableRng for DefaultRand {
47    type Seed = <Xoroshiro128StarStar as SeedableRng>::Seed;
48
49    fn seed_from_u64(state: u64) -> Self {
50        Self {
51            inner: Xoroshiro128StarStar::seed_from_u64(state),
52        }
53    }
54
55    fn from_seed(seed: Self::Seed) -> Self {
56        Self {
57            inner: Xoroshiro128StarStar::from_seed(seed),
58        }
59    }
60}