Rust中Rayon Parallelized for循环内的成功求和

mspsb9vt  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(109)

我在理解Monty Hall问题时遇到了麻烦,所以我把一些Rust放在一起。我有一个决定参与者是否赢得游戏节目的函数。如果他们赢得了比赛,那么函数返回true,否则返回false。我想测试非常大的数字,所以我在for循环中添加了一个Rayon并行迭代器。代码如下:

fn gameshow(num_doors: usize, num_runs: usize, change: bool) -> usize {
    let mut won_games:usize = 0;
    let runs: Vec<Vec<bool>> = vec![stagehand(num_doors); num_runs]; // Creates common solution 
    if change {
        ParallelIterator::for_each(IntoParallelIterator::into_par_iter(runs), |game| {
            let winner: bool = run_game_no_change(game); // Each door is chosen randomly when tested
            if winner { won_games += 1;}
        });
    }
    else {
        ParallelIterator::for_each(IntoParallelIterator::into_par_iter(runs), |game| {
            let winner: bool = run_game_no_change(game); // Each door is chosen randomly when tested
            if winner { won_games += 1;}
        });     
    }
    won_games   
}

在编译时,它会抛出“Cannot assign to won_games,as it is a captured variable in a Fn closure”错误。

pb3skfrl

pb3skfrl1#

不能并行修改捕获的外部状态,否则可能会出现数据竞争。人造丝专门设计来防止这种情况。
代替for_each,使用map将每个boolMap到0或1,然后取sum

fn gameshow(num_doors: usize, num_runs: usize, change: bool) -> usize {
    let runs: Vec<Vec<bool>> = vec![stagehand(num_doors); num_runs]; // Creates common solution 
    let won_games = if change {
        runs.into_par_iter().map(|game| {
            let winner: bool = run_game_no_change(game); // Each door is chosen randomly when tested
            if winner { 1 } else { 0 }
        }).sum()
    } else {
        runs.into_par_iter().map(|game| {
            let winner: bool = run_game_no_change(game); // Each door is chosen randomly when tested
            if winner { 1 } else { 0 }
        }).sum()    
    };

    won_games   
}

相关问题