1use crate::xoroshiro::Xoroshiro128StarStar;
2use rand_core::{RngCore, SeedableRng};
3
4#[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 #[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}