5.4. 乱数生成関数

mtlite_result_type mtX_get(mtX_state_t* state)

状態stateで示されるメルセンヌ・ツイスタから乱数を1つ取得する。関数内部にループ処理を持つ。出力値に対する調律を行う。

mtlite_result_type mtX_get_nt(mtX_state_t* state)

状態stateで示されるメルセンヌ・ツイスタから乱数を1つ取得する。関数内部にループ処理を持つ。出力値に対する調律を行わない。

mtlite_result_type mtX_get_nonloop(mtX_state_t* state)

状態stateで示されるメルセンヌ・ツイスタから乱数を1つ取得する。関数内部にループ処理を持たない。出力値に対する調律を行う。

mtlite_result_type mtX_get_nonloop_nt(mtX_state_t* state)

状態stateで示されるメルセンヌ・ツイスタから乱数を1つ取得する。関数内部にループ処理を持たない。出力値に対する調律を行わない。

void mtX_get_block(mtX_state_t* state, mtlite_result_type result[], unsigned int result_size)

状態stateで示されるメルセンヌ・ツイスタからresult_size個の乱数を取得し、resultに格納する。出力値に対する調律を行う。

void mtX_get_block_nt(mtX_state_t* state, mtlite_result_type result[], unsigned int result_size)

状態stateで示されるメルセンヌ・ツイスタからresult_size個の乱数を取得し、resultに格納する。出力値に対する調律を行わない。

mtX_getmtX_get_nonloopおよびmtX_get_blockは、出力値に対する調律を行う。mtX_get_ntmtX_get_nonloop_ntおよびmtX_get_block_ntは調律を行わない。調律を行った方が得られる乱数の次元均等分布が良いが、処理量は増加する。

mtX_getmtX_get_ntmtX_get_nonloopおよびmtX_get_nonloop_ntは、関数呼び出し1回につき1個の乱数を生成する。mtX_get_blockmtX_get_block_ntは、関数呼び出し1回につき複数の乱数を生成する。単一乱数生成よりも複数乱数生成の方が乱数1個当たりの平均生成時間が短い傾向があり、1回の関数呼び出しごとの乱数生成個数が多いほどその傾向は強まる。

mtX_getおよびmtX_get_ntは関数内部にループ処理を持つ。mtX_get_nonloopおよびmtX_get_nonloop_ntはループ処理を持たない。ループ版は、平均計算量は状態ベクトルの長さによらず一定で、最悪計算量は状態ベクトルの長さに比例する。非ループ版は、平均計算量と最悪計算量のどちらも状態ベクトルの長さによらず一定である。ループ版の方が最悪応答時間が長いが、平均応答時間はやや短い傾向がある(プロセッサやコンパイラ、最適化オプションなどに依存する: ループ版の方が平均応答時間が長くなる場合もある)。

mtX_get_blockおよびmtX_get_block_ntの平均計算量は乱数生成個数と状態ベクトルの長さの両方に比例する。乱数生成個数が状態ベクトルの長さよりも十分に大きい場合、状態ベクトルの長さは無視できる。またこのとき、最悪計算量は平均計算量に等しい。

非ループ版とループ版の両方の乱数生成関数を1つのメルセンヌ・ツイスタに対して用いるべきではない: このような操作を行った場合、状態遷移が正しく行われることは保証されない。非ループ版とブロック版の組み合わせも同様である。一方、ループ版とブロック版の混在は正しく扱われることが保証される。

通常はすべての乱数生成関数がライブラリに組み込まれるが、configure実行時に--enable-variantを指定した場合は選択したものだけが組み込まれる。