一尘不染

随机图算法

c#

我有二维数组。我想随机选择一个插槽,并继续这样做,直到我最终选择了所有插槽为止,再也不要选择两次相同的插槽(因此,最后一次选择当然不是随机的)。有众所周知的算法可以做到这一点吗?我正在使用C#,但是显然,这比算法更重要。是的,“大书”在我的购买清单上:)


阅读 230

收藏
2020-05-19

共1个答案

一尘不染

使用前面提到的 Fisher-Yates随机算法(在O(n)时间内)

int X = 3;  int Y = 4;
int[] array = new int[X * Y];

for (int i = 0; i < array.Length; i++) array[i] = i;
FisherYatesShuffle(array);

var randomSlots = array.Select((i,j) => new {x=array[j]%X , y=array[j]/X })
                       .ToArray();

public static void FisherYatesShuffle<T>(T[] array)
{
    Random r = new Random();
    for (int i = array.Length - 1; i > 0; i--)
    {
        int j = r.Next(0, i + 1);
        T temp = array[j];
        array[j] = array[i];
        array[i] = temp;
    }
}
2020-05-19