0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【C++】メルセンヌ・ツイスタで疑似乱数を生成してみよう

Last updated at Posted at 2025-10-21

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()を使用する方法よりも高品質で推奨されている。
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?