Il bias del modulo è un problema che si verifica quando ingenuamente si utilizza l'operazione modulo per ottenere numeri pseudocasuali più piccoli di un determinato "limite superiore".Eliminazione del bias del modulo: come si ottiene nella funzione arc4random_uniform()?
Pertanto, come programmatore C sto utilizzando una versione modificata della funzione arc4random_uniform()
per generare numeri pseudocasuali distribuiti uniformemente.
Il problema è che non capisco come funzioni la funzione, matematicamente.
Questo il commento esplicativo della funzione, seguito da un link al codice sorgente completo:
/*
* Calculate a uniformly distributed random number less than upper_bound
* avoiding "modulo bias".
*
* Uniformity is achieved by generating new random numbers until the one
* returned is outside the range [0, 2**32 % upper_bound). This
* guarantees the selected random number will be inside
* [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound)
* after reduction modulo upper_bound.
*/
Dal commento di cui sopra possiamo definire:
[2^32 % upper_bound, 2^32)
- Intervallo A[0, upper_bound)
- intervallo B
Per funzionare, la funzione si basa sul fatto che le mappe di intervallo A a B. intervallo
La mia domanda è: matematicamente, come mai i numeri nell'intervallo Una mappa uniformemente a quelli dell'intervallo B? E c'è una prova per questo?
Posso suggerire questa lettura: http://ericlippert.com/2013/12/16/how-much-bias-is-introduced-by-the-remainder-technique/ – ouah
"Generazione di nuovi numeri casuali fino a .. . "è una tecnica scadente. Non ho la risposta a portata di mano, ma è meglio ridimensionare il numero casuale nell'intervallo richiesto, che rifiutare e perdere tempo. È questo qualsiasi uso? http://stackoverflow.com/questions/10984974/why-do-people-say-there-is-modulo-bias-when-using-a-random-number-generator L'intera idea di numeri casuali è piena di difficoltà, è facile confondere "casuale" con "uniformemente distribuito". –
"... è meglio ridimensionare il numero casuale nell'intervallo richiesto, ..." Questo in effetti non è possibile :-) Ad esempio, prova a campionare un intero in modo uniforme dall'insieme {1, 2, 3, 4 5} usando un solo lancio di un dado. – m7thon