C++ 11 proporciona std::random_device
para proporcionar números aleatorios no deterministas si hay una fuente disponible. Sin embargo, deberá verificar su implementación para asegurarse de que sea buena. libC++ usa/dev/urandom de forma predeterminada. libstdC++ también lo hace si se define la macro _GLIBCXX_USE_RANDOM_TR1
. La implementación de Visual Studio lamentablemente no es no determinista. editar: a partir de VS2012, su implementación usa los servicios de criptografía de Windows.
Si std::random_device
proporciona acceso a una fuente de aleatoriedad no determinista (normalmente/dev/urandom usa un PRNG criptográfico), esto debería ser suficiente para generar semillas independientes.
#include <random>
int main() {
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 engine(seed);
}
En lugar de utilizar un único valor como semilla, algunos motores pueden funcionar mejor con más datos de inicialización. Una secuencia de semilla es la alternativa proporcionada por el estándar. Los motores pueden ser sembrados con secuencias semilla, que son objetos que se cargan con cualquier cantidad de datos y que producen datos semilla basados en eso.
valores
std::random_device r;
std::vector<std::mt19937> engines;
int engines = 50;
for (int i = 0; i < engines; ++i) {
std::seed_seq s{r(), r(), r(), r(), r(), r(), r(), r()};
engines.emplace_back(s);
}
Ocho de 32 bits, 256 bits, es suficiente, pero si realmente desea puede usar más. Cada uno de los motores estándar documenta la cantidad de datos que utiliza de una secuencia de semilla.
Por ejemplo, cada motor mt19937 recuperará mt19937::state_size
(624) valores de 32 bits de la secuencia inicial.Las semillas recuperadas de la secuencia de semilla no son las mismas que las de entrada, pero están basadas en esa información, por lo que podemos usar esa cantidad de datos aleatorios en la secuencia.
std::random_device r;
std::vector<std::uint_least32_t> data;
std::generate_n(back_inserter(data), 624, std::ref(r));
std::seed_seq seed(begin(data), end(data));
std::mt19937 engine(seed); // 'fully' seeded mt19937
supongo que los números sobre la arquitectura con alma única serían pseudo-aleatorio, sería generar números 1,2,3,4,5,6,7,8 como los métodos y procesos de forma secuencial a través de la CPU haría acaba de tomar lo que está siguiente y actuaría como 'rand(); rand(); return rand(); ' – Vyktor