C++での疑似乱数生成といえば、rand()を使用する方法が最も簡易的な方法だと思いますが、C++では標準ライブラリのみで、高品質な疑似乱数生成器であるメルセンヌ・ツイスタを使用することができます。
本記事では、C++の標準ライブラリのみでメルセンヌ・ツイスタを使用し、疑似乱数の生成方法を紹介します。
メルセンヌ・ツイスタとは
メルセンヌ・ツイスタとは、高品質な疑似乱数生成器です。
- 内部でビット演算が使用されているため処理が高速
- 分布の偏りが少ない
- 実質的に乱数の繰り返しが起こらない
などのメリットがあり、ゲーム開発やシミュレーションなど高精度な疑似乱数が必要になる場面では、srand()を使用して疑似乱数の生成を行う方法よりも推奨される方法です。
コード例
メルセンヌ・ツイスタを使用した疑似乱数生成サンプルコード
メルセンヌ・ツイスタを使用するには、<random>の#includeが必要です。
rand_sample.cpp
#include <iostream>
#include <random>//メルセンヌ・ツイスタの使用に必要
//メイン関数
int main() {
std::random_device rd; // 疑似乱数のソース
std::mt19937 mt(rd()); // メルセンヌ・ツイスタの宣言と初期化
std::uniform_int_distribution<int> dist(1, 100); // 1から100で整数の一様分布を作る
std::cout << "生成された乱数: ";
// 10回乱数を生成
for (int i = 0; i < 10; ++i) {
int value = dist(mt); // 乱数生成
std::cout << value << " ";
}
// 改行
std::cout << std::endl;
//終了
system("pause");
return 0;
}
result
生成された乱数: 37 21 87 54 98 51 46 25 44 72
続行するには何かキーを押してください . . .
疑似乱数が生成できました。
std::mt19937が生成器クラスで、コンストラクタで乱数種を渡して初期化を行います。
ここでは std::random_device から取得した値を乱数種に使用しています。
std::random_device rd; // 疑似乱数のソース
std::mt19937 mt(rd()); // メルセンヌ・ツイスタの宣言と初期化
std::uniform_int_distribution<T>で、任意の数値型の一様分布を作ります。
テンプレート引数には任意の数値型、コンストラクタの第一引数には疑似乱数の最小値、第二引数には最大値を渡します。
std::uniform_int_distribution<int> dist(1, 100); // 1から100で整数の一様分布を作る
乱数を生成する際は、一様分布のクラスにstd::mt19937型変数を渡してください。
int value = dist(mt); // 乱数生成
総括
-
C++では、標準ライブラリのみで高品質な疑似乱数生成器であるメルセンヌ・ツイスタが使用できる。 -
メルセンヌ・ツイスタを使う方法は、rand()を使用する方法よりも高品質で推奨されている。