C++入門/疑似乱数

柴田祐樹,東京都立大学,情報科学科
戻る

一様乱数の C++ での生成法を解説する.ここでいう乱数は疑似乱数のことである.疑似乱数とは,数列の計算により生成されるもので,初期値を設定することができ,初期値が同じであればいつ実行しても同じ数列が生成されるもののことを言う.これに対し,一般の乱数とは,次に生成される値が予測できない物を言う.疑似乱数は同じ初期値に対し同じ数列が生成されるため,再現性があることから,数値実験において重宝する.

以下に擬似乱数生成のための基本的なコードを記載する.6 行目で乱数の種を設定しており,この値が同じなら全く同じ乱数列となる.逆に,この値が少しでも異なれば乱数列は大きく異なる.7行目はMersenne Twister と呼ばれる乱数を生成するオブジェクトの宣言であり,8, 9行目はそれぞれ一様乱数を疑似乱数オブジェクトを使い生成するオブジェクトを宣言している.

#include <random>
#include <iostream>
int main(){
    // 乱数の使い方を説明する.
    using namespace std;
    int seed = 8; // 乱数の種. この値により結果が大きく変わる.
    mt19937 mt(seed); // 疑似乱数生成器. メルセンヌ・ツイスタと呼ばれる高性能なもの. 
    uniform_int_distribution<int> di(0, 2); // int 型で0以上2以下の整数を生成
    uniform_real_distribution<double> dd(0, 1); // double 型で0以上2以下の整数を生成

    cout << di(mt) << "\n"; // 乱数生成器オブジェクトを指定して生成する.
    cout << di(mt) << "\n";
    cout << dd(mt) << "\n";
    cout << dd(mt) << "\n";
}
疑似乱数 のソースコード

実際に上記を実行してみれば以下の通り出力されるはずである.

2
0
0.23944
0.377517

seed を777に設定した場合は次の通り出力されるはずである.

0
1
0.200726
0.636254
https://krectmt3.sd.tmu.ac.jp/ProBaseII/