C++11 以降は、random クラスでメルセンヌ・ツイスターを扱える。
test-c++-rand3.cpp |
/* * http://vivi.dyndns.org/tech/cpp/random.html * https://cpprefjp.github.io/reference/random */ #include <iostream> #include <random> int main(void) { std::random_device rnd; // 非決定的な乱数生成器 unsigned int seed1 = rnd(), seed2 = rnd(); std::cout << "seed1=" << seed1 << ", seed2=" << seed2 << std::endl; std::mt19937 mt(seed1); // 決定的な乱数生成器 (rnd で初期化) std::mt19937_64 mt2(seed2); // 決定的な乱数生成器 (rnd で初期化) std::uniform_int_distribution<> rand100(0, 99); //{0,1,..,99} の一様乱数 std::uniform_real_distribution<> rand01(0.0, 1.0); // [0,1) 範囲の一様乱数 std::cout << "非決定的な乱数(16進)" << std::endl; for (int i = 0; i < 10; ++i) { std::cout << std::hex << rnd() << "\n"; } std::cout << "32ビットの乱数(16進)" << std::endl; for (int i = 0; i < 10; ++i) { std::cout << std::hex << mt() << "\n"; } std::cout << "32ビットの乱数(10進)" << std::endl; for (int i = 0; i < 10; ++i) { std::cout << std::dec << mt() << "\n"; } std::cout << "64ビットの乱数(16進)" << std::endl; for (int i = 0; i < 10; ++i) { std::cout << std::hex << mt2() << "\n"; } std::cout << "64ビットの乱数(10進)" << std::endl; for (int i = 0; i < 10; ++i) { std::cout << std::dec << mt2() << "\n"; } std::cout << "{0,1,...,99} 上の一様乱数" << std::endl; for (int i = 0; i < 10; ++i) { std::cout << std::dec << rand100(mt) << "\n"; } std::cout << "[0,1) 上の一様乱数" << std::endl; for (int i = 0; i < 10; ++i) { std::cout << std::dec << rand01(mt) << "\n"; } return 0; } |