C#国旗猜谜程序如何生成不重复随机索引避免国旗重复展示
问题根源
- 你当前把
Random实例的创建放在了按钮点击事件内部,C#中Random默认以系统时间戳作为随机种子,如果两次点击间隔过短,时间戳未发生变化,就会生成完全相同的随机数,导致国旗重复。 - 没有记录已经展示过的国旗索引,就算随机数生成逻辑正常,也有概率随机到已经出现过的数值。
修复方案
把Random改为类级别全局变量,新增列表存储已经使用过的国旗索引,每次随机时排除已用过的索引,所有国旗都展示过之后重置列表即可开启新一轮答题。
第一步:声明全局成员
把以下代码放在窗体类的内部,不要放在按钮点击方法里:
// 全局随机数生成器,全程只实例化一次 private Random random = new Random(); // 存储已经展示过的国旗索引 private List<int> usedIndexes = new List<int>(); // 提前把所有国旗路径存入数组,替代冗余的if判断逻辑 private string[] flagPaths = new string[] { "C:/Users/Kacper/Desktop/FlagiDoGeo/Poland.png", "C:/Users/Kacper/Desktop/FlagiDoGeo/France.png", "C:/Users/Kacper/Desktop/FlagiDoGeo/Sweden.jpg", "C:/Users/Kacper/Desktop/FlagiDoGeo/Germany.png", "C:/Users/Kacper/Desktop/FlagiDoGeo/Portugal.png", "C:/Users/Kacper/Desktop/FlagiDoGeo/Spain.png", "C:/Users/Kacper/Desktop/FlagiDoGeo/Finland.png", "C:/Users/Kacper/Desktop/FlagiDoGeo/Norway.png", "C:/Users/Kacper/Desktop/FlagiDoGeo/Russia.png", "C:/Users/Kacper/Desktop/FlagiDoGeo/Ukraine.png" };
第二步:修改按钮点击逻辑
把原来的按钮点击方法替换为以下代码:
private void button1_Click(object sender, EventArgs e) { // 所有国旗都展示过的话,清空已使用列表,开启新一轮答题 if (usedIndexes.Count == flagPaths.Length) { usedIndexes.Clear(); } int randomized; // 循环随机直到拿到未使用过的国旗索引 do { randomized = random.Next(0, flagPaths.Length); } while (usedIndexes.Contains(randomized)); // 记录当前使用的索引,后续不再重复 usedIndexes.Add(randomized); // 加载对应国旗 ptbFlag.Image = Image.FromFile(flagPaths[randomized]); }
额外优化说明
- 后续新增国旗只要往
flagPaths数组里追加路径即可,不需要新增if判断,也不需要修改随机数的取值范围 - 所有国旗展示完毕后会自动重置,不需要重启程序就能开始下一轮答题
内容的提问来源于stack exchange,提问作者Kacper Wojtkiel
相关产品推荐
相关产品推荐

