Algoritmo de trama aleatória

Eu tenho dois array dimensional. Eu quero escolher um slot aleatoriamente e continuar fazendo isso, nunca escolhendo o mesmo slot duas vezes até que eu finalmente tenha escolhido todos os slots (então nada random sobre a última escolha, é claro). Existe um algoritmo bem conhecido para fazer isso? Eu estou usando c #, mas obviamente isso é mais sobre algoritmos do que qualquer plataforma específica. Sim, ‘o grande livro’ está na minha lista de compras 🙂

Usando o algoritmo de embaralhamento de Fisher-Yates como mencionado antes (no tempo 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[] 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; } } 

Dê uma olhada no shuffle de Fisher-Yates . Ele foi projetado para escolher uma permutação aleatória de um conjunto.

Assumindo que seu array é assim:

 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]; 

Isso deve funcionar bem.

Eu fiz isso por números

 list PastList=new PastList(); 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; }