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

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();

08-06 01:22