如何使用Random类填充二维数组?代码生成重复值问题求助
问题分析与解决方案
咱们先拆解你遇到的两个问题:所有元素都是15,以及你担心的未遍历每个元素填充(其实你的代码已经在遍历,只是可能逻辑可读性或随机数生成的小问题导致结果不符合预期)
1. 为什么所有元素都是15?
你把Random声明为static是非常正确的做法——避免重复初始化导致生成完全相同的随机序列。但如果每次运行都得到全15的结果,大概率是这两个原因:
- 你可能在短时间内多次重启程序,
Random默认用系统时钟做种子,快速重启会导致种子重复,生成了相同的初始值; - 或者你测试时的巧合(虽然概率极低,但也有可能第一次生成的序列开头全是15)。
解决这个问题的小技巧:给Random指定一个绝对随机的种子,比如用Guid的哈希值,确保每次启动程序的种子都不一样:
static Random random = new Random(Guid.NewGuid().GetHashCode());
2. 确保遍历数组每个元素填充
你的代码其实已经在遍历二维数组的每个元素了,但咱们可以优化循环顺序,让逻辑更符合常规思维:
二维数组中arr.GetLength(0)代表行数,arr.GetLength(1)代表列数,通常我们会先遍历行,再遍历列,这样和数组索引arr[r,c](行在前、列在后)的逻辑完全对应,可读性更强:
public static void FillArray(int[,] arr) { // 遍历每一行 for (int r = 0; r < arr.GetLength(0); r++) { // 遍历当前行的每一列 for (int c = 0; c < arr.GetLength(1); c++) { arr[r, c] = random.Next(15, 96); } } }
这样的写法能明确看到每个元素都被随机值覆盖,不会有遗漏。
完整可运行代码
把修正后的代码整合,再补上PrintArray方法的实现,方便你直接测试:
using System; class Program { static Random random = new Random(Guid.NewGuid().GetHashCode()); static void Main(string[] args) { int[,] array = new int[3, 5]; FillArray(array); PrintArray(array); } public static void FillArray(int[,] arr) { for (int r = 0; r < arr.GetLength(0); r++) { for (int c = 0; c < arr.GetLength(1); c++) { arr[r, c] = random.Next(15, 96); } } } public static void PrintArray(int[,] arr) { for (int r = 0; r < arr.GetLength(0); r++) { for (int c = 0; c < arr.GetLength(1); c++) { Console.Write($"{arr[r, c],3}"); } Console.WriteLine(); } } }
运行这段代码,你会看到3行5列的数组,每个元素都是15到95之间的随机数,不会再出现全15的情况啦。
内容的提问来源于stack exchange,提问作者Nuclear Crab
相关产品推荐
相关产品推荐

