Rust代码运行触发panic:移除索引超出长度问题求助
Rust蒙提霍尔模拟程序panic问题修复
你的panic问题根源很明确:调用not_already_chosen.remove(...)时传入的索引超出了当前数组的有效范围。Rust里Vec的索引从0开始,当数组长度是2时,合法索引只有0和1,你传了2,直接触发越界panic。
为什么会出现这个问题?
大概率是你生成随机索引的逻辑有问题:比如你用了初始的总门数(比如3)来生成索引范围,但not_already_chosen是排除玩家选择后的数组,长度已经变成2了,这时候再生成0-2的随机数,就有可能抽到2,导致越界。
修复步骤
- 按当前数组长度生成索引
每次要移除元素前,都基于not_already_chosen的当前长度来生成随机索引,确保索引在0到len-1之间:
use rand::Rng; // 假设not_already_chosen是Vec<usize>类型 let rng = rand::thread_rng(); let idx = rng.gen_range(0..not_already_chosen.len()); not_already_chosen.remove(idx);
- 贴合蒙提霍尔问题逻辑优化
蒙提霍尔问题中,主持人必须打开不是玩家选择、也不是奖品所在的门,所以你应该先过滤出符合条件的门,再从中选择移除,这样既符合逻辑,也能避免索引问题:
let prize_door = 1; // 示例奖品门 let player_choice = 0; // 示例玩家选择 let mut not_already_chosen = vec![1,2]; // 排除玩家选择后的门 // 过滤出主持人可以打开的门:不是奖品的 let mut host_available = not_already_chosen .iter() .filter(|&&door| door != prize_door) .cloned() .collect::<Vec<_>>(); // 主持人打开其中一个 let opened_door = host_available.remove(rand::thread_rng().gen_range(0..host_available.len()));
这样处理后,host_available里至少有一个元素(3门场景下,玩家选1个,剩下2个里至少有一个非奖品),不会出现空数组调用remove的情况,也不会有索引越界。
内容的提问来源于stack exchange,提问作者Deadputo2024
相关产品推荐
相关产品推荐

