Ho bisogno di una funzione che generi un numero intero casuale in un determinato intervallo (compresi i valori dei bordi). Non ho irragionevoli requisiti di qualità / casualità, ho quattro requisiti:
- Ho bisogno che sia veloce. Il mio progetto deve generare milioni (o talvolta anche decine di milioni) di numeri casuali e la mia attuale funzione di generatore ha dimostrato di essere un collo di bottiglia.
- Ho bisogno che sia ragionevolmente uniforme (l'uso di rand () va benissimo).
- gli intervalli min-max possono essere compresi tra <0, 1> e <-32727, 32727>.
- deve essere seminabile.
Al momento ho il seguente codice C ++:
output = min + (rand() * (int)(max - min) / RAND_MAX)
Il problema è che non è davvero uniforme - viene restituito max solo quando rand () = RAND_MAX (per Visual C ++ è 1/32727). Questo è un grosso problema per piccoli intervalli come <-1, 1>, dove l'ultimo valore non viene quasi mai restituito.
Quindi ho preso carta e penna e ho trovato la seguente formula (che si basa sul trucco di arrotondamento intero (int) (n + 0,5)):
Ma non mi dà ancora una distribuzione uniforme. Ripetizioni ripetute con 10000 campioni mi danno un rapporto di 37:50:13 per valori valori -1, 0. 1.
Potresti suggerire una formula migliore? (o anche l'intera funzione del generatore di numeri pseudo-casuali)