我在 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# 中创建的字符串列表中提取唯一的随机元素,我期望它提供随机的唯一值,但当我单击按钮执行代码时,值几乎总是重复。
你的问题出在这个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);
}