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

for循环数组越界问题求助:C#掷骰子代码报错原因排查

排查C#数组越界问题及代码优化建议

嘿,我来帮你理清这个数组越界的问题!

问题根源分析

你代码里的核心问题出在数组初始化的时机上:

  • 一开始你定义了int throws = 1;,紧接着用这个值初始化了int[] oneDice = new int[throws];,这时候oneDice数组的长度就固定为1了(只能访问索引0的位置)。
  • 之后你通过用户输入修改了throws的值,但数组的长度是在创建时就确定的,不会跟着变量的更新而自动扩容。所以当你输入的次数大于1时,循环for (int i = 0; i < throws; i++)就会尝试访问oneDice[1]、oneDice[2]……这些超出数组长度的索引,自然就触发越界错误了。

另外还有个小坑:你在循环里每次都new Random();,Random默认用系统当前时间作为种子,循环执行速度极快,多次new出来的Random会生成完全相同的随机数,这可不是掷骰子该有的效果哦。

修正后的代码

//dice throws to arrays
Console.WriteLine("Number of throws: ");
// 先获取用户输入的投掷次数
int throws = Convert.ToInt32(Console.ReadLine());
// 再根据输入的次数初始化数组,确保长度匹配
int[] oneDice = new int[throws];
int[,] twoDice = new int[throws, throws];

Console.WriteLine("Throws one dice "+throws+" times: ");
// 将Random实例放在循环外,避免重复生成相同种子的随机数
Random random = new Random();
for (int i = 0; i < throws; i++) {
    // Next(1,7)生成1-6的整数,符合骰子的点数范围(原来的Next(6)是0-5)
    oneDice[i] = random.Next(1,7);
    Console.WriteLine(oneDice[i]);
}

关键修正点说明

  • 调整数组初始化顺序:先获取用户输入的投掷次数,再用这个值创建数组,保证数组长度和循环次数完全匹配,从根源避免越界。
  • 优化Random实例创建:把Random放在循环外面,只创建一次,这样生成的随机数才是真正随机的。
  • 修正随机数范围:把random.Next(6)改为random.Next(1,7),因为骰子的点数是1到6,原来的写法会生成0-5的数,不符合实际需求。

内容的提问来源于stack exchange,提问作者Louise Bjerre Thomsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:48:48