MT による疑似乱数生成器(C++ Version)
本編は、
- 疑似乱数生成のアルゴリズムを MT(Mersenne Twister) を利用
- プログラミング言語として C++ 言語を利用
したソースコードについて記載されています。
から構成されます。
I. 概要
MT(Mersenne Twister) で疑似乱数を生成します。
用途に応じたビット数の疑似乱数の生成
や、疑似乱数生成器の状態の保存・復元
を比較的容易に行えます。
構成は、ANSI 標準関数に置き換えて考えると分かり易いかもしれません。
II. 利用方法
関数のプロタイプは、nx_mtrandom.h で宣言されています(実装も含まれています)。
利用するソースコードにこれをインクルードします。
III. クラスリファレンス
以下、クラス仕様のリファレンスです。
上記クラスは、i. CnxMtRandom から導出されています。
i. CnxMtRandom
本クラスは、以下のメンバ関数から構成されます。
- コンストラクタ
- 疑似乱数生成器の初期化
- 疑似乱数の取得
- 疑似乱数生成器の状態の入出力
a. CnxMtRandom(その 1)
-
プロトタイプ
-
void CnxMtRandom(void);
-
機能
-
デフォルトのコンストラクタです。
-
引数
-
なし。
b. CnxMtRandom(その 2)
-
プロトタイプ
-
void CnxMtRandom(unc_32_t uSeed);
-
機能
-
構築と同時に疑似乱数生成器に初期値を与えます。
-
引数
-
-
uSeed
-
疑似乱数生成器に与える初期値。
c. SetSeed
-
プロトタイプ
-
void SetSeed(unc_32_t uSeed);
-
機能
-
疑似乱数生成器に初期値を与えます。
初期値のデフォルトは、19650218 です。
引数 uSeed に 19650218 を与えると、
デフォルトの状態に再初期化されます。
-
戻り値
-
なし。
-
引数
-
-
uSeed
-
疑似乱数生成器に与える初期値。
d. SetSeeds
-
プロトタイプ
-
void SetSeeds(cunc_32_t auSeed, unc_32_t uSeeds);
-
機能
-
疑似乱数生成器に uSeeds 個の初期値を与えます。
乱数の多様性が 0xffffffffh(4294967295) 個で足りない場合に利用します。
-
戻り値
-
なし。
-
引数
-
-
auSeed
-
疑似乱数生成器に与える初期値の配列。
-
uSeeds
-
疑似乱数生成器に与える初期値の配列数。
e. Randomize
-
プロトタイプ
-
void Randomize(void);
-
機能
-
疑似乱数生成器に適当な初期値を与えます。
実装は time 関数の戻り値を疑似乱数生成器に与える初期値としています。
-
戻り値
-
なし。
-
引数
-
なし。
f. GetCookie
-
プロトタイプ
-
unc_32_t GetCookie(void);
-
機能
-
0 から FFFFFFFFh(4294967295) の範囲内の疑似乱数(32 ビット符号なし整数値)を返します。
必要があれば SetSeed メンバ関数、若しくは Randomize メンバ関数を使って、
疑似乱数生成器を初期化します。
-
戻り値
-
0 から FFFFFFFFh(4294967295) の範囲内の疑似乱数(32 ビット符号なし整数値)。
-
引数
-
なし。
g. SerialIn
-
プロトタイプ
-
int SerialIn(istream* pIn);
-
機能
-
SerialOut 関数によって出力された疑似乱数生成器の状態をシリアルに入力し復元します。
-
戻り値
-
エラーが発生すると 0 未満。
-
引数
-
-
pIn
-
入力ストリーム。
h. SerialOut
-
プロトタイプ
-
int SerialOut(ostream* pOut);
-
機能
-
現在の疑似乱数生成器の状態をシリアルに出力します。
出力の内容は、SerialIn 関数によって復元します。
-
戻り値
-
エラーが発生すると 0 未満。
-
引数
-
-
pOut
-
出力ストリーム。
i. SerialInFile
-
プロトタイプ
-
int SerialInFile(char const* pszFileName);
-
機能
-
SerialOutFile 関数によって出力された疑似乱数生成器の状態が保存されたファイルを入力し復元します。
-
戻り値
-
エラーが発生すると 0 未満。
-
引数
-
-
pszFileName
-
入力するファイル名。
j. SerialOutFile
-
プロトタイプ
-
int SerialOutFile(char const* pszFileName);
-
機能
-
現在の疑似乱数生成器の状態をファイルに出力します。
出力されたファイルの内容は、SerialInFile 関数によって復元します。
-
戻り値
-
エラーが発生すると 0 未満。
-
引数
-
-
pszFileName
-
出力するファイル名。
ii. CnxMtRandomU8
本クラスは、CnxMtRandom から導出されています。
本クラスは、以下のメンバ関数から構成されます。
a. CnxMtRandomU8(その 1)
-
プロトタイプ
-
CnxMtRandomU8(void);
-
機能
-
デフォルトのコンストラクタです。
-
引数
-
なし。
b. CnxMtRandomU8(その 2)
-
プロトタイプ
-
CnxMtRandomU8(unc_32_t uSeed);
-
機能
-
構築と同時に疑似乱数生成器に初期値を与えます。
-
引数
-
-
uSeed
-
疑似乱数生成器に与える初期値。
c. Get
-
プロトタイプ
-
unc_8_t Get(void);
-
機能
-
0 から FFh(255) の範囲内の疑似乱数(8 ビット符号なし整数値)を返します。
必要があれば SetSeed メンバ関数、若しくは Randomize メンバ関数を使って、
疑似乱数生成器を初期化します。
-
戻り値
-
0 から FFh(255) の範囲内の疑似乱数(8 ビット符号なし整数値)。
-
引数
-
なし。
iii. CnxMtRandomU16
本クラスは、CnxMtRandom から導出されています。
本クラスは、以下のメンバ関数から構成されます。
a. CnxMtRandomU16(その 1)
-
プロトタイプ
-
CnxMtRandomU16(void);
-
機能
-
デフォルトのコンストラクタです。
-
引数
-
なし。
b. CnxMtRandomU16(その 2)
-
プロトタイプ
-
CnxMtRandomU16(unc_32_t uSeed);
-
機能
-
構築と同時に疑似乱数生成器に初期値を与えます。
-
引数
-
-
uSeed
-
疑似乱数生成器に与える初期値。
c. Get
-
プロトタイプ
-
unc_16_t Get(void);
-
機能
-
0 から FFFFh(65535) の範囲内の疑似乱数(16 ビット符号なし整数値)を返します。
必要があれば SetSeed メンバ関数、若しくは Randomize メンバ関数を使って、
疑似乱数生成器を初期化します。
-
戻り値
-
0 から FFFFh(65535) の範囲内の疑似乱数(16 ビット符号なし整数値)。
-
引数
-
なし。
iv. CnxMtRandomU32
本クラスは、CnxMtRandom から導出されています。
本クラスは、以下のメンバ関数から構成されます。
a. CnxMtRandomU32(その 1)
-
プロトタイプ
-
CnxMtRandomU32(void);
-
機能
-
デフォルトのコンストラクタです。
-
引数
-
なし。
b. CnxMtRandomU32(その 2)
-
プロトタイプ
-
CnxMtRandomU32(unc_32_t uSeed);
-
機能
-
構築と同時に疑似乱数生成器に初期値を与えます。
-
引数
-
-
uSeed
-
疑似乱数生成器に与える初期値。
c. Get
-
プロトタイプ
-
unc_32_t Get(void);
-
機能
-
0 から FFFFFFFFh(4294967295) の範囲内の疑似乱数(32 ビット符号なし整数値)を返します。
必要があれば SetSeed メンバ関数、若しくは Randomize メンバ関数を使って、
疑似乱数生成器を初期化します。
GetCookie メンバ関数のシノニムです。
-
戻り値
-
0 から FFFFFFFFh(4294967295) の範囲内の疑似乱数(32 ビット符号なし整数値)。
-
引数
-
なし。
v. CnxMtRandomU64
本クラスは、CnxMtRandom から導出されています。
本クラスは、以下のメンバ関数から構成されます。
a. CnxMtRandomU64(その 1)
-
プロトタイプ
-
CnxMtRandomU64(void);
-
機能
-
デフォルトのコンストラクタです。
-
引数
-
なし。
b. CnxMtRandomU64(その 2)
-
プロトタイプ
-
CnxMtRandomU64(unc_32_t uSeed);
-
機能
-
構築と同時に疑似乱数生成器に初期値を与えます。
-
引数
-
-
uSeed
-
疑似乱数生成器に与える初期値。
c. Get
-
プロトタイプ
-
unc_64_t Get(void);
-
機能
-
0 から FFFFFFFFFFFFFFFFh(18446744073709551615) の範囲内の疑似乱数(64 ビット符号なし整数値)を返します。
必要があれば SetSeed メンバ関数、若しくは Randomize メンバ関数を使って、
疑似乱数生成器を初期化します。
-
戻り値
-
0 から FFFFFFFFFFFFFFFFh(18446744073709551615) の範囲内の疑似乱数(64 ビット符号なし整数値)。
-
引数
-
なし。
vi. CnxMtRandomR32
本クラスは、CnxMtRandom から導出されています。
本クラスは、以下のメンバ関数から構成されます。
a. CnxMtRandomR32(その 1)
-
プロトタイプ
-
CnxMtRandomR32(void);
-
機能
-
デフォルトのコンストラクタです。
-
引数
-
なし。
b. CnxMtRandomR32(その 2)
-
プロトタイプ
-
CnxMtRandomR32(rnc_32_t uSeed);
-
機能
-
構築と同時に疑似乱数生成器に初期値を与えます。
-
引数
-
-
uSeed
-
疑似乱数生成器に与える初期値。
c. Get
-
プロトタイプ
-
rnc_32_t Get(void);
-
機能
-
0 から 1 未満(U32_TO_R32_LT_1*0xFFFFFFFFh)の範囲内の疑似乱数(32 ビット浮動小数点値)を返します。
必要があれば SetSeed メンバ関数、若しくは Randomize メンバ関数を使って、
疑似乱数生成器を初期化します。
-
戻り値
-
0 から 1 未満の範囲内の疑似乱数(32 ビット浮動小数点値)。
-
引数
-
なし。
vii. CnxMtRandomR64
本クラスは、CnxMtRandom から導出されています。
本クラスは、以下のメンバ関数から構成されます。
a. CnxMtRandomR64(その 1)
-
プロトタイプ
-
CnxMtRandomR64(void);
-
機能
-
デフォルトのコンストラクタです。
-
引数
-
なし。
b. CnxMtRandomR64(その 2)
-
プロトタイプ
-
CnxMtRandomR64(rnc_32_t uSeed);
-
機能
-
構築と同時に疑似乱数生成器に初期値を与えます。
-
引数
-
-
uSeed
-
疑似乱数生成器に与える初期値。
c. Get
-
プロトタイプ
-
rnc_64_t Get(void);
-
機能
-
0 から 1 未満(U32_TO_R64_LT_1*0xFFFFFFFFh)の範囲内の疑似乱数(64 ビット浮動小数点値)を返します。
必要があれば SetSeed メンバ関数、若しくは Randomize メンバ関数を使って、
疑似乱数生成器を初期化します。
-
戻り値
-
0 から 1 未満の範囲内の疑似乱数(64 ビット浮動小数点値)。
-
引数
-
なし。
IV. ソースコードの信憑性
以下のコンパイラでそれぞれコンパイルを行い、
動作確認を行いました。
テスト方法は、
デバッグライトと mt19937int.out.txt の diff による比較に基づいて行いました。
そのデバッグライトは、main.cpp に記述されています。
- gcc version 2.95.3-5 (cygwin special)
- Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
- Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
V. 参考
M. Matsumoto and T. Nishimura, "Mersenne Twister: A 623-Dimensionally
Equidistributed Uniform Pseudo-Random Number Generator", ACM Transactions on
Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30.