2009-05-28 10 views
24

Estoy buscando una forma de generar secuencias de números pseudoaleatorias que produzcan resultados de secuencia idénticos para una semilla determinada en cualquier plataforma. Estoy asumiendo que rand()/srand() no va a ser consistente (fácilmente podría estar equivocado sobre esta suposición).Números pseudoaleatorios constantes en las plataformas

+1

ver mi pregunta y respuesta para C++ 11 generadores aleatorios. El C++ 11 mt19937 ofrece resultados consistentes en todas las plataformas, pero las distribuciones estándar no, así que creé mis propias distribuciones: http://stackoverflow.com/questions/34903356/c11-random-number-distributions-are-not -consistent-across-platforms-what-al –

Respuesta

17

Algo como un Mersenne Twister (from Boost.Random) es determinista.

+0

Si prefiere evitar Boost, puede usar la implementación original de [Mersenne Twister] (http://www.math.sci.hiroshima-u.ac.jp/ ~ m-mat/MT/emt.html), que se escribió directamente en C. En los últimos años, el grupo MT ha agregado algunos puertos adicionales que pueden hacer uso de SIMD, OpenCL y CUDA. – sfstewman

+0

vea mi pregunta y respuesta para C++ 11 generadores aleatorios. El C++ 11 mt19937 ofrece resultados consistentes en todas las plataformas, pero las distribuciones estándar no, así que creé mis propias distribuciones: http://stackoverflow.com/questions/34903356/c11-random-number-distributions-are-not -consistent-across-platforms-what-al –

0

La manera más fácil sería escribir un generador de números aleatorios usted mismo, pero usar una biblioteca que se lanza para diferentes plataformas y que garantiza los mismos resultados también podría funcionar.

Dudo rand()/srand() son consistentes, pero no lo sé.

0

A rápidamente googled reference dice:

Dos inicializaciones diferentes con la misma semilla, la instrucción de generador pseudoaleatorio para generar la misma sucesión de resultados para los posteriores llamadas a rand en ambos casos.

Pero la pregunta permanece. Supongo que la especificación anterior solo se aplica a los RNG dentro del mismo proceso. Lo más probable es que no especifique nada sobre cosas multiplataforma o de compilación cruzada. Su mejor opción es encontrar una biblioteca que esté disponible para todas las plataformas deseadas. Entonces debería estar razonablemente seguro de que si se siembra con el mismo valor devuelven la misma secuencia de números.

+0

Creo que esto se refiere al comportamiento de cualquier implementación particular de 'rand()', y no proporciona ninguna compilación cruzada o aseguramiento multiplataforma. Además, con los PRNG incorporados arriesga todo tipo de propiedades no deseadas. Use una biblioteca con un PRNG que se sepa que es apropiado para sus necesidades. – dmckee

5

Me doy cuenta de que este es un hilo antiguo, pero ahora con C++ 11 hay un montón de new options available. Aquí es un ejemplo destilado a partir de la página que por defecto es usar el motor Mersenne Twister y Normal distribución:

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <map> 
#include <random> 

int main() 
{ 
    std::random_device rd; 

    // 
    // Engines 
    // 
    std::mt19937 e2(rd()); 
    //std::knuth_b e2(rd()); 
    //std::default_random_engine e2(rd()) ; 

    // 
    // Distribtuions 
    // 
    std::normal_distribution<> dist(2, 2); 
    //std::student_t_distribution<> dist(5); 
    //std::poisson_distribution<> dist(2); 
    //std::extreme_value_distribution<> dist(0,2); 

    std::map<int, int> hist; 
    for (int n = 0; n < 10000; ++n) { 
     ++hist[std::round(dist(e2))]; 
    } 

    for (auto p : hist) { 
     std::cout << std::fixed << std::setprecision(1) << std::setw(2) 
        << p.first << ' ' << std::string(p.second/200, '*') << '\n'; 
    } 
} 
+6

Las distribuciones especificadas por el estándar C++ 11 no son ** ** necesarias para producir resultados reproducibles con la misma semilla, incluso cuando se utiliza el mismo código. Por no hablar de usar diferentes bibliotecas, como libC++ vs libstdC++. – OmnipotentEntity

+1

vea mi pregunta y respuesta para C++ 11 generadores aleatorios. El C++ 11 mt19937 ofrece resultados consistentes en todas las plataformas, pero las distribuciones estándar no, así que creé mis propias distribuciones: http://stackoverflow.com/questions/34903356/c11-random-number-distributions-are-not -consistent-across-platforms-what-al –

1

que han estado trabajando en una biblioteca simplerandom para esto. Se supone que es multiplataforma, y ​​también intento apuntar a múltiples idiomas. Actualmente es compatible con C y Python (los mismos números se generan en ambos idiomas). Planeo implementar los mismos generadores en C++ pronto, siguiendo la API aleatoria de Boost y C++ 11.

Cuestiones relacionadas