arc4random() restituisce un 32 bit senza segno intero, significa i valori sono compresi tra 0 e 2^32-1 = 4 294 967 295.
Ora, i risultati di polarizzazione dal fatto che la pluralità di sottointervalli creato con il modulo non si adattano esattamente all'intervallo di uscita casuale. Consente di immaginare per chiarezza un generatore casuale che crea numeri compresi tra 0 e 198 inclusi. Volete i numeri da 0 a 99, quindi si calcola casuale()% 100, cedendo 0-99:
0% 100 = 0
99% 100 = 99
100% 100 = 0
198% 100 = 98
Si vede che 99 è l'unico numero che può avvenire solo una volta mentre tutti gli altri si possono verificare due volte in una corsa. Ciò significa che la probabilità per 99 è dimezzata esattamente che è anche il caso peggiore in una polarizzazione in cui sono coinvolti almeno i sottointervalli 2.
Poiché tutte le potenze di due inferiori all'intervallo di intervallo si adattano perfettamente all'intervallo 2^32 , in questo caso il bias scompare.
Le implicazioni sono che quanto più piccolo è il set di risultati con modulo e quanto più alto è l'intervallo di uscita casuale, minore è il bias. Nell'esempio, 6 è il limite superiore (presumo 0 è il limite inferiore), quindi si utilizza% 7, risultante che 0-3 si verifica 613 566 757 volte mentre 4-6 si verifica 613 566 756 volte.
Quindi 0-3 è 613 566 757/613 566 756 = 1,0000000016298 volte più probabile di 4-6.
Mentre sembra facile respingere, alcuni esperimenti (specialmente Monte-Carlo esperimenti) sono state viziate proprio perché queste apparentemente incredibili piccoli differenze erano abbastanza importante.
Ancora peggio è il bias se l'intervallo di uscita desiderato è più grande rispetto a l'intervallo di destinazione casuale. Si prega di leggere il Fisher-Yates shuffle ingresso perché molti siti di poker hanno imparato nel modo più duro che le normali lineari generatori casuali congruenziali e algoritmi di mischiare le cattive provocato mazzi impossibili o molto probabili o peggio, prevedibili ponti.
fonte
2013-07-14 15:49:19
Ottima spiegazione del problema. I lettori potrebbero anche essere interessati all'implementazione, che è pubblicamente disponibile: http://opensource.apple.com/source/Libc/Libc-825.26/gen/FreeBSD/arc4random.c È vero che in molte applicazioni il bias non ha importanza, ma è così devastante nei casi in cui * è * importante che i programmatori debbano sempre avere l'abitudine di usare '_uniform'. –
Come si evita il pregiudizio? –
@android, riducendo l'intervallo di selezione a qualcosa di multiplo di ciò che desideri e quindi arrotolando i numeri casuali fino a quando non sei all'interno dell'intervallo. Se si desidera un numero casuale 1-4 da un dado a sei facce, il modo corretto per ottenerlo è di farlo rotolare fino a quando il numero è compreso tra 1 e 4. Stesso principio. –