random() c++
¿Por qué obtengo la misma secuencia para cada ejecución con std:: random_device con mingw gcc4.8.1? (4)
GCC no implementa rd.entropy () correctamente; siempre devuelve 0 (al menos en Mac OS X).
Desafortunadamente, no parece haber forma de mezclar entropía adicional en random_device, lo que importa porque usualmente / a menudo (mira Linux / dev / random y / dev / urandom, y en la implementación Intel RDRAND) implementa un generador de números pseudoaleatorios bajo el capó. Me gustaría poder mejorar su producción inyectando algo que considero aleatorio para mezclar con lo que sea que produzca su fuente de entropía. Nuevamente, dado que este dispositivo (o módulo kernel) implementa internamente un algoritmo criptográfico para procesar los bits de entropía que obtiene para generar su salida, me gustaría poder "aleatorizar" ese proceso más al inyectar mis propios datos para mezclarlos con lo que sea entropía que elige el dispositivo. Por ejemplo, considere Java SecureRandom (). No le permite establecer la semilla (que de hecho lo convertiría en PRNG), pero felizmente mezclaría lo que proporciona con cualquier cosa que esté utilizando para "aleatorizar" aún más su salida.
Personalmente prefiero RDRAND. Una pequeña biblioteca de ensamblaje con una interfaz C compacta. Aquí están las referencias:
David Johnson de Intel explica RDRAND en Stackoverflow
Punteros Stackoverflow a la fuente de biblioteca RDRAND para Windows, Linux y Mac OS X
Blog de Intel en la biblioteca RDRAND y un enlace de descarga
Uso el siguiente código para probar la c++ <random>
.
¿Por qué obtengo la misma secuencia exacta para cada ejecución del ejecutable compilado? ¿Es rd()
determinista en la compilación? ¿Cómo obtengo una salida diferente para cada ejecución?
GCC 4.8.1 en Windows 7 64bit. Usando la distribución de MinGW desde http://nuwen.net/mingw.html
EDITAR: Probé el mismo código de pieza con Visual Studio. No hay ningún problema. Los resultados no son deterministas. Esto podría ser un error en mingw gcc 4.8.1 I used.
#include <iostream>
#include <random>
using namespace std;
int main(){
random_device rd;
mt19937 mt(rd());
uniform_int_distribution<int> dist(0,99);
for (int i = 0; i< 16; ++i){
cout<<dist(mt)<<" ";
}
cout <<endl;
}
De http://en.cppreference.com/w/cpp/numeric/random/random_device :
Tenga en cuenta que std :: random_device se puede implementar en términos de un motor de número pseudoaleatorio si una fuente no determinista (por ejemplo, un dispositivo de hardware) no está disponible para la implementación.
Sin embargo, esperaría una implementación decente para al menos sembrar el RNG.
Editar: sospecho que deliberadamente eligieron entregar la misma secuencia cada vez, para hacer obvio el hecho de que la transmisión no fue tan aleatoria como se había prometido.
Es posible que deba pasar un parámetro al constructor:
https://gcc.gnu.org/onlinedocs/gcc-4.9.1/libstdc++/api/a00899.html
Recibí una respuesta confirmada de STL de MSFT :
A diferencia de VC, GCC no implementó random_device de manera no determinista en Windows. Boost tiene, entonces puedes usar Boost.Random.