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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:24:04