MT による疑似乱数生成器(C++ Version)

本編は、 したソースコードについて記載されています。 から構成されます。

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 に記述されています。

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.