2010-07-25 7 views
6

me gustaría ser capaz de hacer algo como esto (obviamente no válido C++):la generación de dos secuencias independientes de números aleatorios (C++)

rng1 = srand(x) 
rng2 = srand(y) 

//rng1 and rng2 give me two separate sequences of random numbers 
//based on the srand seed 
rng1.rand() 
rng2.rand() 

¿Hay alguna manera de hacer algo como esto en C++? Por ejemplo, en Java puedo crear dos objetos java.util.Random con las semillas que quiero. Parece que hay un solo generador de números aleatorios globales en C++. Estoy seguro de que hay bibliotecas que ofrecen esta funcionalidad, pero de todos modos para hacerlo con solo C++?

+4

Dado que los números devueltos por 'rand' son (pseudo-) aleatorios, ¿por qué necesita más de un generador? Obtener 2n números de un generador de números aleatorios debería dar resultados similares a obtener n números de cada uno de los dos generadores de números aleatorios. –

+3

@James: considere una simulación de cola con una fuente de aleatoriedad que controla la llegada de nuevas tareas, y otra fuente de aleatoriedad que influye en el tiempo para completar cada tarea. Es posible que desee repetir cada experimento varias veces, replicando el escenario de "llegada de tareas", pero con diferentes estadísticas de "finalización de tareas", y que requeriría tener múltiples RNG que se pueden sembrar de forma independiente. –

+0

@Jim: estoy de acuerdo en que podría usarse para eso. Creo que es mejor alimentar manualmente los datos "aleatorios" en lugar de confiar en el PRNG. –

Respuesta

0

como @James McNellis dijo: No puedo imaginar por qué harías eso, y qué profesionales obtendrás. Describe qué efecto te gustaría lograr.

+3

Esto sería mejor dejarlo como un comentario, no como una respuesta. – indiv

7

En TR1 (y C++ 0x), puede usar el encabezado tr1/random. Debe estar incorporado para los compiladores modernos de C++ (al menos para g++ y MSVC).

#include <tr1/random> 
// use #include <random> on MSVC 
#include <iostream> 

int main() { 

    std::tr1::mt19937 m1 (1234); // <-- seed x 
    std::tr1::mt19937 m2 (5678); // <-- seed y 

    std::tr1::uniform_int<int> distr(0, 100); 

    for (int i = 0; i < 20; ++ i) { 
     std::cout << distr(m1) << "," << distr(m2) << std::endl; 
    } 

    return 0; 
} 
+0

+1 para la solución estándar (próxima a ser). –

1

Solo quiero señalar que el uso de semillas diferentes puede no proporcionarle estadísticamente secuencias aleatorias independientes. mt19937 es una excepción. Dos objetos mt19937 inicializados con diferentes semillas te darán más o menos (dependiendo de a quién se pregunte) secuencias estadísticamente independientes con una probabilidad muy alta (hay una pequeña posibilidad de que las secuencias se superpongan). El RNG estándar de Java es notoriamente malo. Hay muchas implementaciones de mt19937 para Java, que deberían preferirse a las RNG de serie.

+0

¿Qué significa "estadísticamente" i.r.v.? – bruziuz

0

Por alguna razón, los siguientes generadores interfieren entre sí. Necesito dos generadores independientes para una tarea y necesito reconstruir las secuencias. No he profundizado en el código, pero los generadores std :: tr1 y C++ 11 parecen compartir estados en común. Agregar m2 a continuación cambia lo que m1 entregará.

std::tr1::mt19937 m1 (1234); // <-- seed x 
std::tr1::mt19937 m2 (5678); // <-- seed y 

Tuve que construir el mío para asegurar la independencia.

Cuestiones relacionadas