java - with - ¿Cuál es el beneficio de sembrar un generador de números aleatorios con solo números primos?
random number java 8 (3)
Mientras realizaba algunos experimentos en Java, mi supervisor de proyecto me recordó sembrar cada iteración del experimento con un número diferente. También mencionó que debería usar números primos para los valores iniciales. Esto me hizo pensar: ¿por qué primos? ¿Por qué no otro número como semilla? Además, ¿por qué el número primo debe ser lo suficientemente grande? ¿Algunas ideas? Yo mismo le hubiera preguntado esto, pero son las 4 de la mañana en este momento, todos están dormidos, me acabo de acordar de esta pregunta y estoy ansioso por saber la respuesta (estoy seguro de que conoces la sensación).
Sería bueno si pudiera proporcionar algunas referencias, ¡estoy muy interesado en el concepto matemático detrás de todo esto!
EDITAR:
Estoy usando java.util.Random.
MÁS EDITACIÓN:
Mi profesor proviene de un entorno C, pero estoy usando Java. No sé si eso ayuda. Parece que utilizar números primos es su idiosincrasia, pero creo que hemos desenterrado algunas respuestas interesantes sobre la generación de números aleatorios. ¡Gracias a todos por el esfuerzo!
Bien, un parpadeo en la implementación le mostraría que NO PUEDE tener ninguna razón para ese reclamo. ¿Por qué? Porque así es como se ve la función set seed:
synchronized public void setSeed(long seed) {
seed = (seed ^ multiplier) & mask;
this.seed.set(seed);
haveNextNextGaussian = false;
}
Y eso es exactamente lo que llama el constructor. Por lo tanto, incluso si le das un primo, no lo usará de todos modos, así que si lo hicieras, deberías usar una semilla s donde (s ^ multiplicador) y la máscara da como resultado un primo;)
Java usa un método de congruencia lineal habitual, es decir:
x_n + 1 = (a * x_n + c) mod m con 2 <= a <m; 0 <= c <m.
Dado que desea obtener un período máximo, c y m tienen que ser relativamente primos y algunas otras limitaciones bastante oscuras, además de algunos consejos sobre cómo obtener una versión prácticamente útil. Knuth obviamente lo cubre en detalle en la parte 2;)
Pero de todos modos, la semilla no influye en las cualidades del generador en absoluto. Incluso si la implementación utilizara un generador de Lehmer, obviamente se aseguraría de que N sea primo (de lo contrario, el algoritmo es prácticamente inútil y no se distribuye uniformemente si todos los valores aleatorios deben ser coprimarios para una apuesta NI no principal) lo que hace el punto discutible
Si el generador es un generador de Lehmer, entonces la semilla y el módulo deben ser coprima; ver la página wiki . Una forma de garantizar que sean coprimarios es comenzar con un número primo.
Si está hablando de java.util.Random
, o de una de sus subclases en el tiempo de ejecución de Oracle, no hay ninguna razón para esto. Es solo un capricho de tu supervisor.