numeri casuali distribuiti uniformemente relativamente primi a 2
-
21-08-2019 - |
Domanda
Un esempio specifico
Ho bisogno di generare un numero casuale compreso tra 0 e 2, estremi inclusi. (O scegliere a caso tra -1, 0 e 1).
L'approccio naive sarebbe quello di fare qualcosa di simile rand() mod 3
dove rand()
restituisce un intero. Questo approccio non generare numeri casuali statisticamente a meno che il limite superiore di <=> non è relativamente primo (e il limite inferiore è pari a 0).
Per esempio, supponendo rand () restituito 2 bit (da 0 a 3 compreso), il modulo mapperebbe:
0 -> 0
1 -> 1
2 -> 2
3 -> 0
Questa inclinazione verso 0 sarebbe ovviamente molto meno se più bit verrebbero restituiti, ma indipendentemente, l'inclinazione rimarrebbero.
La domanda generica
C'è un modo per generare un numero casuale distribuito uniformemente tra 0 e n-1, inclusiva, dove n è relativamente privilegiata per 2?
Soluzione
Un approccio comune è di scartare valori casuali sopra l'ultimo ciclo completo, e basta chiedere per un nuovo numero casuale.
Altri suggerimenti
Potrebbe essere utile la scelta del vostro rand () limite superiore di essere k * n dove k è un numero intero. In questo modo il risultato sarà distribuito uniformemente purché rand () è un buon generatore casuale.
Se non è possibile ridurre il limite superiore, si può scegliere k in modo che k * n è il più vicino a rand () limite superiore possibile e scartare i risultati di cui sopra questo numero di riprovare.
mia risposta a una domanda simile.
In sostanza, utilizzare il RNG e scartare tutto sopra N e riprovare. Per l'ottimizzazione, è possibile utilizzare mod, e gettare tutto sopra n * piano (MAX / n)
Risposta Generico: È necessario utilizzare più di appena 2 bit del numero.
mia regola è quello di generare valori in virgola mobile, x , 0,0 <= x <1.0, moltiplicare per 3 e troncare. Questo dovrebbe farti i valori nel range 0, 1 e 2 che dipendono da un maggior numero di bit.