gpt4 book ai didi

c# - 无效的阵列洗牌器

转载 作者:行者123 更新时间:2023-11-30 21:18:49 24 4
gpt4 key购买 nike

我正在尝试打乱一个数组,但我这样做的方式大约每五次才有效。如果有人能解释为什么它不能正常工作并提出调整建议,我将不胜感激。

private Button[] scrambleBoard(Button[] buttons)
{
for (int x = 100 * buttons.Count(); x > 0; x--)
{
Random rand = new Random();
int first = rand.Next(buttons.Count());
int second = rand.Next(buttons.Count());


Button temp = buttons[first];
buttons[first] = buttons[second];
buttons[second] = temp;
}

return buttons;
}

最佳答案

将下面这行移到循环外:

Random rand = new Random();

System.Random 使用的默认种子基于 Environment.TickCount。在紧密循环中,滴答计数可能不会在连续迭代之间发生变化,因此它最终可能会一遍又一遍地使用相同的种子。因此,循环将重复交换相同 的两个元素,直到滴答计数发生变化(在循环完成之前可能不会这样做)。要验证这是问题所在,您可以尝试在循环内添加 Thread.Sleep(100) 或类似内容;然后您应该能够看到随机播放正常工作(尽管非常慢)。

您还应该注意 technique you're using排列数组是有偏见的;并非每个排列的可能性都相同。您可能希望使用已知无偏的改组算法,例如 Fisher-Yates shuffle .

或者,您可以使用一种非常简单的技术来洗牌。它的效率有点低,但没有偏见:

var rand = new Random();
return buttons.OrderBy(button => rand.Next()).ToArray();

关于c# - 无效的阵列洗牌器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4057172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com