binius_utils/
rand.rs

1// Copyright 2026 The Binius Developers
2
3//! Parallel random number generation utilities.
4
5use rand::{Rng, SeedableRng};
6
7use crate::rayon::prelude::*;
8
9/// Generates random values in parallel using a deterministic per-index seeding scheme.
10///
11/// Creates a base seed from the provided RNG, then for each index `i` in `0..n`,
12/// XORs the index bytes into the seed to create a unique but deterministic seed
13/// for that index's RNG.
14pub 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}