随机唯一列表 - 在 C# 中不提供唯一值

问题描述 投票:0回答:1

我在 Visual Studio C# 中创建了一个表单,并尝试为每个标签分配一个唯一的随机类别(编号从 1 到 9),但每次单击随机按钮时似乎都有重复值。我从 Fisher-Yates shuffle 中获取了代码,它应该按预期工作,我缺少哪一部分使我的标签具有非唯一值?请参阅下面的代码:

   public void button2_Click(object sender, EventArgs e)

    {

        List<String> unshuffledCategories = new List<String> { "History", "Geography", "Music",    "Animals", "Logos", "Flags", "Food", "games", "Sports" };
        List<String> shuffledCategories = new List<string>();

        Random r = new Random();

        var labels = new List<Label> { lblField1, lblField2, lblField3, lblField4, lblField5, lblField6, lblField7, lblField8, lblField9 };

        for (int n = unshuffledCategories.Count; n > 0; --n)
        {
            int k = r.Next(n);

            String temp = unshuffledCategories[k];
            shuffledCategories.Add(temp);
        }

        for (int i = 0; i < labels.Count; i++)
        {
            labels[i].Text = shuffledCategories[i];
        }
    }

希望有人能帮助我,非常感谢<3!

我尝试创建一个表单,从我在 C# 中创建的字符串列表中提取唯一的随机元素,我期望它提供随机的唯一值,但当我单击按钮执行代码时,值几乎总是重复。

c# random unique
1个回答
0
投票

你的问题出在这个for循环中。在循环的每次迭代中,您都会获得 1 到 (9-n) 之间的随机数。没有什么可以阻止您在后续迭代中获得相同的数字。理论上,您最终可能 9 次都得到“1”。

    for (int n = unshuffledCategories.Count; n > 0; --n)
    {
        int k = r.Next(n);

        String temp = unshuffledCategories[k];
        shuffledCategories.Add(temp);
    }
© www.soinside.com 2019 - 2024. All rights reserved.