números aleatorios uniformemente distribuidos primos entre 2
-
21-08-2019 - |
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?
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.