2012-08-31 9 views
8

Estoy atrapado en el generador aleatorio. La especificación de requisitos muestra una muestra como esta:¿Cada máquina genera el mismo resultado de número aleatorio usando la misma semilla?

Random rand = new Random(3412); 

El resultado rand no está directamente dado hacia fuera, sino que se utiliza para la otra rendimiento.

Escribí el mismo código que el anterior para generar un número al azar por una semilla 3412. sin embargo, el resultado del rendimiento en reposo es totalmente diferente con la muestra.

El resultado de la generación es 518435373, utilicé el mismo código que probé en el compilador C# en línea, pero obteniendo un resultado diferente de generación que es 11688046, el resultado de rendimiento restante también fue diferente con la muestra.

Así que me pregunto si se supone que es diferente en diferentes máquinas.

Por cierto, ¿alguien podría proporcionar el resultado de su máquina solo ver si es lo mismo conmigo.

+1

Puede probarlo fácilmente usted mismo. Si aparecieran los mismos números aleatorios, obtendría el valor aleatorio de una semilla determinada, por ejemplo, 1000 veces y obtendría los mismos 1000 números si volviera a realizar la prueba ... Por lo tanto, podría probar esto muy rápidamente y descubrir que no es el caso. – BugFinder

+2

@Bridge: es * no * aleatorio. Es un generador de números * pseudoaleatorio. –

+0

@Bridge: No, en absoluto. Por favor, lea la documentación citada en mi respuesta. –

Respuesta

14

Esperaría que una implementación para dar la misma secuencia para la misma semilla, pero puede haber diferentes implementaciones involucradas. Por ejemplo, un "compilador de C# en línea" bien puede terminar usando Mono, que espero que tenga una implementación diferente a la de .NET.

No sé si las implementaciones han cambiado entre versiones de .NET, pero de nuevo, eso parece totalmente posible.

La documentación de los estados Random(int) constructor:

Proporcionar un valor de semilla idéntica a diferentes objetos al azar hace que cada instancia para producir secuencias idénticas de números aleatorios.

... pero no especifica las implicaciones de las diferentes versiones, etc. Demonios, ni siquiera indica si las versiones x86 y x64 darán los mismos resultados. Esperaría los mismos resultados dentro de una instancia de CLR específica (es decir, un proceso, y no dos CLR funcionando uno al lado del otro, tampoco *.

Si necesita algo más estable, comenzaría con un determinado algoritmo de - Apuesto a que hay implementaciones del Mersenne Twister etc disponibles

+0

es posible que debido a las diferentes versiones de Visual Studio, estoy usando 2010 profesional, pero supongo que el código de muestra está utilizando 2010 express –

+1

@IvanLi: No, eso no hará la diferencia en absoluto. Sin embargo, es posible que tenga que enfocarse en diferentes versiones del marco. –

6

no se especifica como hacer tal promesa, por lo que debe asumir que no lo hace

una buena regla.. con cualquier especificación, no es hacer promesas que no son necesarias para un uso razonable, por lo que es más libre de mejorar las cosas más adelante.

De hecho, la documentación Random 's dice:

La implementación actual de la clase Random se basa en el algoritmo generador de números aleatorios de sustracción de Donald E. Knuth.

Tenga en cuenta la frase "implementación actual", lo que implica que puede cambiar en el futuro.Esto sugiere que no solo no existe una promesa de coherencia entre versiones, sino que tampoco tiene ninguna intención.

Si una especificación requiere números pseudoaleatorios consistentes, entonces debe especificar el algoritmo así como el valor inicial. De hecho, incluso si se especificó Random como una promesa de este tipo, ¿qué pasa si necesita una implementación que no sea .NET de la totalidad o parte de su especificación, o de algo que interopera con ella, en el futuro?

+0

Está * especificado * como una promesa tal * en cierta medida * ... simplemente no está muy bien especificado: "Proporcionar un valor inicial idéntico a diferentes objetos Aleatorios hace que cada instancia produzca secuencias idénticas de números aleatorios". - Por desgracia, eso no dice nada sobre la estabilidad en diferentes versiones :( –

+0

@JonSkeet Esa es la única promesa de la que estaba hablando. –

0

El proveedor en línea que ha intentado puede usar la implementación Mono del CLR, que es diferente de la que proporciona Microsoft. Probablemente su implementación de clase Random sea un poco diferente.

1

Esto probablemente se deba a diferentes versiones de marco. Eche un vistazo a this

Cuestiones relacionadas