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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top