Per mescolare casualmente un array, senza pregiudizi verso una particolare permutazione, c'è l'algoritmo di Knuth Fischer-Yeats. In Python:
#!/usr/bin/env python
import sys
from random import randrange
def KFYShuffle(items):
i = len(items) - 1
while i > 0:
j = randrange(i+1) # 0 <= j <= i
items[j], items[i] = items[i], items[j]
i = i - 1
return items
print KFYShuffle(range(int(sys.argv[1])))
C'è anche l'algoritmo di Sattolo, che produce cicli casuali. In Python:
#!/usr/bin/env python
import sys
from random import randrange
def SattoloShuffle(items):
i = len(items)
while i > 1:
i = i - 1
j = randrange(i) # 0 <= j <= i-1
items[j], items[i] = items[i], items[j]
return items
print SattoloShuffle(range(int(sys.argv[1])))
Attualmente sto scrivendo una simulazione con le seguenti specifiche per un algoritmo shuffling:
- L'algoritmo è imparziale. Se è stato utilizzato un vero generatore di numeri casuali, nessuna permutazione sarebbe più probabile di qualsiasi altra.
- Nessun numero finisce nel suo indice originale. L'input per lo shuffle sarà sempre A [i] = i per i da 0 a N-1
- Le permutazioni sono prodotte che non sono cicli, ma soddisfano comunque la specifica 2.
I cicli prodotti dall'algoritmo di Sattolo soddisfano la specifica 2, ma non la specifica 1 o 3. I ' Ho lavorato alla creazione di un algoritmo che soddisfi queste specifiche, ciò che mi è venuto in mente era equivalente all'algoritmo di Sattolo.
Qualcuno ha un algoritmo per questo problema?