two randomize number float example and c++ c random

randomize - random() c++



Números pseudoaleatorios constantes en todas las plataformas (6)

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

Estoy buscando una forma de generar secuencias numéricas pseudoaleatorias que produzcan resultados de secuencia idénticos para una semilla dada a través de cualquier plataforma. Asumo que rand() / srand() no va a ser consistente (fácilmente podría equivocarme sobre esta suposición).


He 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.



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

Dudo que rand () / srand () sea consistente, pero no lo sé.


Me doy cuenta de que este es un hilo viejo, pero ahora con C ++ 11 hay un montón de nuevas opciones disponibles . Aquí hay un ejemplo destilado de la página que por defecto usa el motor Mersenne Twister y Normal distribución Normal :

#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''; } }


Una reference rápida en Google dice:

Dos inicializaciones diferentes con la misma semilla, instruyen al generador pseudoaleatorio para generar la misma sucesión de resultados para las llamadas subsiguientes 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.