我需要在程序中多次生成f32
的巨大随机向量,因此我正在寻找使其并行和高效的方法。我已经在使用Rayon的into_par_iter
方面取得了一些进展,但我还没有找到一种方法来避免在Map过程中初始化一个新的rng变量。
以下是我目前拥有的:
let r_dist = Uniform::new(0., 10.);
let rand_vec: Vec<f32> = (1..biiiig_u64)
.into_par_iter()
.map(|_| {
let mut rng = rand::thread_rng();
rng.sample(r_dist)})
.collect();
当然这是充分利用所有的cpu核心,但我觉得在Map函数内部初始化新的mut rng
效率很低(我是新来的,所以我可能错了)。有没有可能在迭代器之外初始化rng,并以非不安全的方式使用它?谢谢
1条答案
按热度按时间fzsnzjdm1#
thread_rng
是专为在多线程中有效使用而设计的。docs:检索系统播种的lazily-initialized thread-local随机数生成器。
因此,每个线程创建一次,并存储在线程局部变量中。应该已经很快了。
然而,人造丝有一个方法完全适合您的用例:
map_init
。