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
Respuesta
Algo como un Mersenne Twister (from Boost.Random) es determinista.
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
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 –
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é.
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.
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
Knuth tiene released into the public domain C (and FORTRAN) source code para el generador de números pseudo-aleatoria se describe en la sección 3.6 de The Art of Computer Programación.
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';
}
}
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
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 –
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.
- 1. Generador de números pseudoaleatorios - Distribución exponencial
- 2. Siembra de un generador de números pseudoaleatorios en C#
- 3. Reproducibilidad de números java pseudoaleatorios en sistemas y versiones?
- 4. Generador rápido de números pseudoaleatorios para contenido de procedimientos
- 5. ¿Cómo se prueba un generador de números pseudoaleatorios?
- 6. Números mágicos contra constantes con nombre
- 7. ¿Las semillas cercanas en la generación de números aleatorios pueden dar números aleatorios similares?
- 8. Las ventajas de las constantes
- 9. ¿Cómo uso constantes en haskell para evitar números mágicos?
- 10. ¿Cómo se cuantifica la calidad de un generador de números pseudoaleatorios?
- 11. Generar datos pseudoaleatorios rápidos en PHP
- 12. Práctica recomendada para constantes globales que implican números mágicos
- 13. Lisp en plataformas integradas
- 14. Problemas con el siembra de un generador de números pseudoaleatorios más de una vez?
- 15. Cómo establecer la inicialización personalizada para el generador de números pseudoaleatorios
- 16. Cómo definir adecuadamente las constantes
- 17. Usando numeric_limits :: max() en las expresiones constantes
- 18. ¿Las constantes están ancladas en C#?
- 19. Miembros constantes no inicializados en las clases
- 20. ¿Son posibles las constantes privadas en PHP?
- 21. donde definir las constantes en cakephp
- 22. 2d física de plataformas
- 23. midi keyboard no funciona en todas las plataformas
- 24. ¿Las URL relativas al protocolo funcionan en plataformas cruzadas?
- 25. Delphi: ¿Todas las constantes son constantes, pero algunas son más constantes que otras?
- 26. ¿Cómo manejar las comillas simples en las constantes de internacionalización?
- 27. ¿Qué opciones tengo en las plataformas MS Windows para el equivalente de SUID desde plataformas basadas en Unix?
- 28. Constantes en MATLAB
- 29. Generación de números aleatorios en Spartan-3E
- 30. Donde mantener las constantes PL/SQL?
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 –