Necesito una función que genere un número entero aleatorio en un rango determinado (incluidos los valores de borde). No tengo requisitos de calidad / aleatoriedad irracionales, tengo cuatro requisitos:
- Necesito que sea rápido. Mi proyecto necesita generar millones (o incluso decenas de millones) de números aleatorios y mi función actual de generador ha demostrado ser un cuello de botella.
- Necesito que sea razonablemente uniforme (el uso de rand () está perfectamente bien).
- los rangos min-max pueden ser desde <0, 1> hasta <-32727, 32727>.
- Tiene que ser visible.
Actualmente tengo el siguiente código C ++:
output = min + (rand() * (int)(max - min) / RAND_MAX)
El problema es que no es realmente uniforme: max solo se devuelve cuando rand () = RAND_MAX (para Visual C ++ es 1/32727). Este es un problema importante para rangos pequeños como <-1, 1>, donde el último valor casi nunca se devuelve.
Así que tomé lápiz y papel y se me ocurrió la siguiente fórmula (que se basa en el truco de redondeo de enteros (int) (n + 0.5)):
Pero todavía no me da una distribución uniforme. Las ejecuciones repetidas con 10000 muestras me dan una relación de 37:50:13 para valores valores -1, 0. 1.
¿Podría por favor sugerir una mejor fórmula? (o incluso la función de generador de números pseudoaleatorios completos)