1use rand::{Rng, SeedableRng};
6
7use crate::rayon::prelude::*;
8
9pub fn par_rand<InnerR, T, F>(
15 n: usize,
16 mut rng: impl Rng,
17 f: F,
18) -> impl IndexedParallelIterator<Item = T>
19where
20 InnerR: SeedableRng,
21 InnerR::Seed: Send + Sync,
22 T: Send,
23 F: Fn(InnerR) -> T + Sync + Send,
24{
25 let mut base_seed = InnerR::Seed::default();
26 rng.fill_bytes(base_seed.as_mut());
27
28 (0..n).into_par_iter().map(move |i| {
29 let mut seed = base_seed.clone();
30 let seed_bytes = seed.as_mut();
31
32 let index_bytes = i.to_le_bytes();
33 for (seed_byte, &index_byte) in seed_bytes.iter_mut().zip(index_bytes.iter()) {
34 *seed_byte ^= index_byte;
35 }
36
37 f(InnerR::from_seed(seed))
38 })
39}