unificare e semplificare alcuni dei campioni già forniti Vorrei riassumere 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{}()));
Poi ho corse alcuni test per vedere che cosa le impostazioni predefinite assomigliano:
#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 il output:
min: 234 mean: 2147328297 max: 4294966759
min: 349 mean: 1073305503 max: 2147483423
min: 601 mean: 1073779123 max: 2147483022
min: -2147481965 mean: 178496 max: 2147482978
Quindi, come possiamo vedere, mt19937 e default_random_engine hanno un intervallo predefinito diverso, quindi si consiglia l'uso di uniform_int_distribution.
Inoltre, default_int_distribution è [0, max_int] (non negativo), anche quando si utilizza un tipo di intero con segno. Deve fornire l'intervallo in modo esplicito se si desidera un intervallo completo.
Infine, its important to remember this in momenti come questi.
Wikipedia? http://en.wikipedia.org/wiki/C%2B%2B0x#Extensible_random_number_facility – quasiverse
Cosa c'è di sbagliato nel codice che hai? AFAIK, i nuovi generatori di numeri casuali sono stati aggiunti per più applicazioni "serie" in cui gli aspetti della generazione di numeri casuali sono davvero importanti. – GManNickG
@GMan: Per essere onesti, molti dei motori di numeri casuali nel nuovo standard potrebbero essere descritti come semplici e veloci e non li vedrei come particolarmente "seri". –