unificar y simplificar algunas de las muestras ya previstas voy a resumir a:
// Good random seed, good engine
auto rnd1 = std::mt19937(std::random_device{}());
// Good random seed, default engine
auto rnd2 = std::default_random_engine(std::random_device{}());
// like rnd1, but force distribution to int32_t range
auto rnd3 = std::bind(std::uniform_int_distribution<int32_t>{}, std::mt19937(std::random_device{}()));
// like rnd3, but force distribution across negative numbers as well
auto rnd4 = std::bind(std::uniform_int_distribution<int32_t>{std::numeric_limits<int32_t>::min(),std::numeric_limits<int32_t>::max()}, std::mt19937(std::random_device{}()));
Entonces me encontré con algunas pruebas para ver cuáles son los valores por defecto se parecen:
#include <random>
#include <functional>
#include <limits>
#include <iostream>
template<class Func>
void print_min_mean_max(Func f) {
typedef decltype(f()) ret_t;
ret_t min = std::numeric_limits<ret_t>::max(), max = std::numeric_limits<ret_t>::min();
uint64_t total = 0, count = 10000000;
for (uint64_t i = 0; i < count; ++i) {
auto res = f();
min = std::min(min,res);
max = std::max(max,res);
total += res;
}
std::cout << "min: " << min << " mean: " << (total/count) << " max: " << max << std::endl;
}
int main() {
auto rnd1 = std::mt19937(std::random_device{}());
auto rnd2 = std::default_random_engine(std::random_device{}());
auto rnd3 = std::bind(std::uniform_int_distribution<int32_t>{}, std::mt19937(std::random_device{}()));
auto rnd4 = std::bind(std::uniform_int_distribution<int32_t>{std::numeric_limits<int32_t>::min(),std::numeric_limits<int32_t>::max()}, std::mt19937(std::random_device{}()));
print_min_mean_max(rnd1);
print_min_mean_max(rnd2);
print_min_mean_max(rnd3);
print_min_mean_max(rnd4);
}
Produce la salida:
min: 234 mean: 2147328297 max: 4294966759
min: 349 mean: 1073305503 max: 2147483423
min: 601 mean: 1073779123 max: 2147483022
min: -2147481965 mean: 178496 max: 2147482978
Como podemos ver, mt19937 y default_random_engine tienen un rango predeterminado diferente, por lo que se recomienda usar uniform_int_distribution.
Además, el valor predeterminado uniform_int_distribution es [0, max_int] (no negativo), incluso cuando se utiliza un tipo de entero con signo. Debe proporcionar el rango explícitamente si desea un rango completo.
Finalmente, its important to remember this en momentos como estos.
Wikipedia? http://en.wikipedia.org/wiki/C%2B%2B0x#Extensible_random_number_facility – quasiverse
¿Qué problema hay con el código que tienes? AFAIK, los nuevos generadores de números aleatorios se agregaron para aplicaciones más "serias" donde los aspectos de la generación de números aleatorios realmente importan. – GManNickG
@GMan: Para ser justos, varios de los motores de números aleatorios en el nuevo estándar podrían describirse como simples y rápidos y no los vería como particularmente "graves". –