随机时隙算法

本文关键字:算法 时隙 随机 | 更新日期: 2023-09-27 18:26:43

我有二维数组。我想随机选择一个插槽,并继续这样做——在我最终选择所有插槽之前,永远不要选择同一个插槽两次(当然,最后一次选择没有随机性)。有没有一种众所周知的算法可以做到这一点?我使用的是C#,但显然这更多的是关于算法,而不是任何特定的平台。是的,"大书"在我的购买清单上:)

随机时隙算法

看看Fisher Yates洗牌。它被设计成从一个集合中挑选一个随机排列。

使用前面提到的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;
    }
}

假设您的数组如下:

Random rand = new Random();
object[,] array = new object[width,height];
bool[,] chosen = new bool[width,height];
int i, j;
do
{
    i = rand.Next(width);
    j = rand.Next(height);
} while (chosen[i,j]);
chosen[i,j] = true;
object current = array[i,j];

这应该很好用。

我这样做是为了数字

list<int> PastList=new PastList<int>();
private void Choоse()
{
   int i = Recurs();
   PastList.Add(i);
}
private int Recurs()
{
   int i;
   i = rnd.Next(0, 99);
   if (PastList.Contains(i))
   {
       i = Recurs();
   }
   return i;
}