Pregunta

Un ejemplo específico

Necesito para generar un número aleatorio entre 0 y 2, inclusive. (O seleccione de forma aleatoria entre -1, 0 y 1).

El enfoque ingenuo sería hacer algo como rand() mod 3 donde rand() devuelve un entero. Este enfoque no va a generar números aleatorios estadísticamente a menos que el límite superior de <=> no es relativamente primos (y el límite inferior es 0).

Por ejemplo, suponiendo rand () devuelto 2 bits (de 0 a 3, inclusive), el módulo sería MAP:

0 -> 0
1 -> 1 | 2 -> 2
3 -> 0

Esta inclinación hacia 0, obviamente, sería mucho menos si se devolverían más bits, pero a pesar de la inclinación permanecerían.

La pregunta genérica

¿Hay una manera de generar un número aleatorio distribuido uniformemente entre 0 y n-1, ambos inclusive, donde n es primo con 2?

¿Fue útil?

Solución

Un enfoque común es descartar valores aleatorios por encima del último ciclo completo, y acaba de pedir un nuevo número aleatorio.

Otros consejos

Podría ayudar la elección de su rand () superior destinada a ser k * n, donde k es un número entero. De esta manera se distribuye de manera uniforme el resultado siempre que rand () es un buen generador aleatorio.

Si no es posible reducir el límite superior, se puede recoger de manera que k k * n es lo más cercano a rand () límite superior de lo posible y desechar los resultados por encima de este número de intentarlo de nuevo.

mi respuesta a una pregunta similar.

Básicamente, utilice su generador de números aleatorios y desechar todo lo anterior N y vuelve a intentarlo. Para la optimización, puede utilizar mod, y desechar todo lo anterior n * piso (MAX / n)

respuesta genérica: Es necesario utilizar más de sólo 2 bits del número.

Mi regla de oro es generar valores de punto flotante, x , 0,0 <= x <1,0, se multiplica por 3 y de truncamiento. Eso ayudaría a que los valores en el rango de 0, 1 y 2 que dependen de un número mayor de bits.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top