2.4.1 C++

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;
}



桂田 祐史