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
相关产品推荐
相关产品推荐

