我在理解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”错误。
1条答案
按热度按时间pb3skfrl1#
不能并行修改捕获的外部状态,否则可能会出现数据竞争。人造丝专门设计来防止这种情况。
代替
for_each
,使用map
将每个bool
Map到0或1,然后取sum
: