我正在尝试改组数组,但是我这样做的方式仅大约每五次运行一次。如果有人能解释为什么它无法正常工作,并提出调整建议,我将不胜感激。
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();