統一とは、すでに私が要約されます提供されたサンプルのいくつかの簡素化:
#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);
}
が生成されます
// 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{}()));
は、それから私は、デフォルトがどのように見えるかを確認するためにいくつかのテストを実行しました出力:
min: 234 mean: 2147328297 max: 4294966759
min: 349 mean: 1073305503 max: 2147483423
min: 601 mean: 1073779123 max: 2147483022
min: -2147481965 mean: 178496 max: 2147482978
私たちが見るように、mt19937とdefault_random_engineはデフォルトの範囲が異なりますので、uniform_int_distributionの使用をお勧めします。
また、符号付き整数型を使用する場合でも、デフォルトのuniform_int_distributionは[0、max_int](負ではない)です。完全な範囲が必要な場合は、明示的に範囲を指定する必要があります。
最後に、its important to remember this時にはこれらのようになります。
ウィキペディア? http://en.wikipedia.org/wiki/C%2B%2B0x#Extensible_random_number_facility – quasiverse
あなたのコードには何が問題なのですか? AFAIKでは、新しい乱数ジェネレータが、乱数生成の側面が本当に重要な、より深刻なアプリケーションに追加されました。 – GManNickG
@GMan:公平になるために、新しい標準の乱数エンジンのいくつかは、シンプルかつ高速であると記述することができ、特に「深刻」とは見なさないでしょう。 –