Sì. In effetti, la maggior parte di questi broken meccanismi di shuffling sono in realtà rotti perché utilizzano algoritmi di shuffling "segreti".
In generale, un meccanismo di shuffling ha due componenti:
- Algoritmo di mischia.
-
Generatore di numeri pseudo casuali (PRNG) .
Sebbene l'algoritmo di shuffling possa avere un certo pregiudizio, l'intero meccanismo di shuffling non può avere meno pregiudizi rispetto al PRNG stesso. In altre parole, un algoritmo di shuffling non può essere più casuale del suo PRNG. Diamo un'occhiata a uno degli algoritmi di shuffling più efficienti là fuori, il Fisher-Yates shuffle .
Il codice sorgente (o, piuttosto, lo pseudocode ) della moderna mescolanza Fisher-Yates è stato pubblicamente disponibile dal 1964, con implementazioni in decine di lingue.
To shuffle an array a of n elements (indices 0..n-1):
for i from n − 1 downto 1 do
j ← random integer with 0 ≤ j ≤ i
exchange a[j] and a[i]
Tuttavia, rimane ancora uno degli algoritmi più utilizzati per questo scopo.
Se guardi da vicino, l'algoritmo dipende da random integer
. È qui che entra in gioco il PRNG. Se il tuo PRNG è imparziale e la tua implementazione è corretta, anche il tuo shuffles dovrebbe essere imparziale.
Sono disponibili molti buoni PRNG che sono ben controllati, testati nel tempo e provati per essere imparziali. Dal momento che un PRNG è deterministico (per lo stesso stato iniziale, restituisce sempre lo stesso valore) la sicurezza / casualità dell'intero meccanismo di mischia si basa sulla casualità dello stato iniziale del PRNG, il suo wikipedia.org/wiki/Random_seed">seed. Questo affidamento sulla qualità del seme è un'estensione del Principio di Kerckhoffs , poiché senza conoscere la conoscenza seme del l'algoritmo non ti dice nulla. Fortunatamente, i PRNG più buoni utilizzano buone "fonti di casualità" fornite dal sistema operativo, come /dev/urandom
.