Algoritmo di shuffling senza "auto-mappatura"?

2

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:

  1. L'algoritmo è imparziale. Se è stato utilizzato un vero generatore di numeri casuali, nessuna permutazione sarebbe più probabile di qualsiasi altra.
  2. Nessun numero finisce nel suo indice originale. L'input per lo shuffle sarà sempre A [i] = i per i da 0 a N-1
  3. 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?

    
posta OregonTrail 12.11.2013 - 18:50
fonte

1 risposta

8

A proposito, uno shuffling (permutazione) che non lascia alcun elemento nella sua posizione originale è chiamato derangement .

Un modo semplice è solo generare una permutazione casuale, verificare se si tratta di un disordine e riprovare se non lo è. Il problema è che non c'è limite superiore al tempo impiegato, ma il numero atteso di shuffles è circa e (2.718 ...), perché la frazione di permutazioni che sono anche derangements si avvicina a 1 / e.

    
risposta data 12.11.2013 - 20:03
fonte

Leggi altre domande sui tag