Rust中随机分布的平行抽样?

ss2ws0br  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(171)

我需要在程序中多次生成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,并以非不安全的方式使用它?谢谢

fzsnzjdm

fzsnzjdm1#

thread_rng是专为在多线程中有效使用而设计的。docs
检索系统播种的lazily-initialized thread-local随机数生成器。
因此,每个线程创建一次,并存储在线程局部变量中。应该已经很快了。
然而,人造丝有一个方法完全适合您的用例:map_init

let r_dist = Uniform::new(0., 10.);

    let rand_vec: Vec<f32> = (1..biiiig_u64)
        .into_par_iter()
        .map_init(rand::thread_rng, |rng, _| rng.sample(r_dist))
        .collect();

相关问题