You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,导致越界。

修复步骤

  1. 按当前数组长度生成索引
    每次要移除元素前,都基于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);
  1. 贴合蒙提霍尔问题逻辑优化
    蒙提霍尔问题中,主持人必须打开不是玩家选择、也不是奖品所在的门,所以你应该先过滤出符合条件的门,再从中选择移除,这样既符合逻辑,也能避免索引问题:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:05:19