2010-10-18 22 views
9

Me he dado cuenta de que la función estándar de rand() da resultados diferentes en Windows y Linux. Por supuesto que he usado el mismo número de semilla (1234). Aquí hay varios primeros resultados:diferentes resultados de rand() en Windows y Linux

ganar: 4068 213 12761 8758

LIN: 465 566 339 961 126 155 479 142 414 1057886067

Mi aplicación requiere que ambas plataformas producen una salida idéntica. ¿Cuáles son mis opciones? ¿Hay algún buen reemplazo para rand() que cumpla con mis requisitos?

gracias

PS. Utilicé MSVC 2008 en Windows7 y gcc 4.1.2 en CentOS 5.5

+2

¿Por qué necesita números aleatorios para ser idénticos en todas las plataformas? Eso no es muy * aleatorio *, después de todo, ¿qué estás tratando de lograr? –

+0

@EamonNerbonne Escenario posible: aplicación desarrollada bajo linux y cygwin y probada con prueba aleatoria. La semilla se imprime para cada prueba. Si la prueba identifica una condición de error, se puede reproducir el caso de error con la ayuda de la semilla.Si uno quiere depurar el caso de error en linux y cygwin sería muy bueno si 'rand' devolviera la misma secuencia aleatoria bajo linux y cygwin. – Tobias

Respuesta

19

Boost tiene wide range of RNGs, presumiblemente con un comportamiento reproducible en todas las plataformas.

+0

Todos los PRNG de Boost tienen referencias al algoritmo que implementan y los parámetros elegidos. Por lo tanto, no solo el comportamiento será reproducible, sino que también se definirá matemáticamente (es decir, existe un estándar absoluto para la corrección) – MSalters

4

No obtendrás los mismos resultados debido a la diferente implementación de las funciones en cualquiera de las plataformas.

7
+0

¿Por qué "no recomendado"? Un LCG es un trivial de una sola línea, y el artículo de Wikipedia ofrece una lista de constantes comúnmente utilizadas que producen un comportamiento más o menos bueno (a la par con las implementaciones de la biblioteca estándar C). –

+5

No se recomienda porque la corrección de la implementación es difícil de probar y cualquier error no es inmediatamente aparente, pero puede causar problemas mucho más tarde durante la ejecución de la aplicación. Además, ¿por qué reinventar la rueda? –

+0

@Eamon: "¿por qué reinventar la rueda?" Es un frackin '** one-liner **. Descargar el encabezado de Boost (aunque esta sería la primera solución que recomendaría, también) garantiza que será más trabajo. Y, en general, estoy de acuerdo con lo correcto. Pero una vez más: es un juego de una sola línea. Que copié de Wikipedia. ¿Qué hay para equivocarse? –

-4

Puede intentar srand (int), que genera números aleatorios basado en la semilla (de entrada)

- Saludos

+2

Es cierto, pero los resultados solo serán los mismos si el algoritmo y los parámetros subyacentes son los mismos. –

3

Creo que incluso se va a encontrar diferentes versiones de Linux devuelve diferentes valores, así como diferentes versiones de ventanas que devuelven valores diferentes.

Puede unificar su generador aleatorio usando el glibc uno, por ejemplo.

Otra opción para usted está escribiendo su propia función PERO hacer que SOLO si está 100% seguro de que no es necesario utilizar el azar para el uso de criptografía o cualquier otro uso que requiera la cosa es tener imprevisibilidad o uniformidad u otras propiedades al azar.

6

Si está satisfecho con el rand implementación estándar y sólo requiere reproducibilidad, puede escribir fácilmente su propio linear congruential generator (adaptación de la interfaz de C, probablemente no es una buena opción - en lugar utilizar una clase en vez!):

namespace myown { 

static int state; 

void srand(int seed) { 
    state = seed; 
} 

int rand() { 
    int const a = 1103515245; 
    int const c = 12345; 
    state = a * state + c; 
    return (state >> 16) & 0x7FFF; 
} 

} 

Esto usa constantes (ANSI C: Watcom) del artículo de Wikipedia.

Dicho esto, preferiría una implementación de Boost realizada por lectura, tal como proponen otros.

+0

+1 para la respuesta correcta a la pregunta (el OP quiere capacidad de reproducción, no un buen RNG). Solo recuerda usar un buen RNG una vez que hayas terminado de probar> ;-) – smirkingman

Cuestiones relacionadas