mt-liteおよび比較対象の疑似乱数アルゴリズムの性質・性能のまとめを以下に示す。
表 6.10. 疑似乱数アルゴリズムの比較
| 名称 | 周期 | 乱数生成個数 | 平均応答時間 [a] | 定数時間応答? [b] | thread safe? | 状態の大きさ [c] | コードの大きさ [d] | 備考 |
|---|---|---|---|---|---|---|---|---|
| mt19937ar | 219937-1 | 単一 | 1 | no | no | 2500 | 350 - 500 | |
| SFMT-mt19937-SIMD-seque | 219937-1 | 単一 | 0.6 - 0.9 | no | no | 2500 | 250 - 400 | 要AltiVec/SSE |
| SFMT-mt19937-SIMD-block | 219937-1 | 複数 | 0.2 - 0.5 | - | no | 2500 | 600 - 900 | 要AltiVec/SSE |
| SFMT-mt19937-noSIMD-seque | 219937-1 | 単一 | 1.3 - 2.2 | no | no | 2500 | 900 - 1100 | |
| SFMT-mt19937-noSIMD-block | 219937-1 | 複数 | 0.4 - 1.4 | - | no | 2500 | 2050 - 2600 | |
| SFMT-mt607-SIMD-seque | 2607-1 | 単一 | 0.5 - 0.6 | no | no | 80 | 350 - 400 | 要AltiVec/SSE |
| SFMT-mt607-SIMD-block | 2607-1 | 複数 | 0.2 - 0.5 | - | no | 80 | 750 - 850 | 要AltiVec/SSE |
| SFMT-mt607-noSIMD-seque | 2607-1 | 単一 | 1.4 - 3.1 | no | no | 80 | 950 - 2650 | |
| SFMT-mt607-noSIMD-block | 2607-1 | 複数 | 0.4 - 1.5 | - | no | 80 | 2900 - 3800 | |
| WELL512a | 2512-1 | 単一 | 0.9 - 1.4 | yes | no | 68 | 150 - 250 | |
| WELL1024a | 21024-1 | 単一 | 0.9 - 1.4 | yes | no | 132 | 150 - 250 | |
| xor128 | 2128-1 | 単一 | 0.5 - 0.7 | yes | no | 16 | 50 - 100 | |
| LCG | 232 | 単一 | 0.3 - 0.5 | yes | no | 4 | 20 - 60 | 性質は実装依存 |
| mtlite-mt19937-loop | 219937-1 | 単一 | 0.5 - 1.0 | no | yes | 2500 | 250 - 400 | |
| mtlite-mt19937-loop-nt | 219937-1 | 単一 | 0.4 - 0.8 | no | yes | 2500 | 250 - 350 | |
| mtlite-mt19937-nonloop | 219937-1 | 単一 | 0.9 - 1.7 | yes | yes | 2500 | 150 - 200 | |
| mtlite-mt19937-nonloop-nt | 219937-1 | 単一 | 0.7 - 1.4 | yes | yes | 2500 | 100 - 200 | |
| mtlite-mt19937-block | 219937-1 | 複数 | 0.7 - 1.0 | - | yes | 2500 | 650 - 800 | |
| mtlite-mt19937-block-nt | 219937-1 | 複数 | 0.4 - 0.6 | - | yes | 2500 | 400 - 550 | |
| mtlite-mt607-loop | 2607-1 | 単一 | 0.5 - 0.9 | no | yes | 80 | 300 - 1200 | |
| mtlite-mt607-loop-nt | 2607-1 | 単一 | 0.4 - 0.8 | no | yes | 80 | 250 - 1150 | |
| mtlite-mt607-nonloop | 2607-1 | 単一 | 0.8 - 1.7 | yes | yes | 80 | 150 - 200 | |
| mtlite-mt607-nonloop-nt | 2607-1 | 単一 | 0.6 - 1.5 | yes | yes | 80 | 100 - 150 | |
| mtlite-mt607-block | 2607-1 | 複数 | 0.7 - 1.0 | - | yes | 80 | 600 - 1700 | |
| mtlite-mt607-block-nt | 2607-1 | 複数 | 0.4 - 0.6 | - | yes | 80 | 400 - 1400 | |
[a] mt19937arを1とする時間比。値は項6.3. 「実行速度」に基づく [b] 単一乱数生成において、常にほぼ同一の時間で応答するか否か [c] 1つの疑似乱数生成器の状態保持のために必要なデータの大きさ。単位はバイト。値は項6.5. 「使用メモリ量」に基づく [d] 乱数生成関数のコードの大きさ。単位はバイト。インライン関数を含む場合はインライン展開回数を1とする。値は項6.5. 「使用メモリ量」に基づく | ||||||||
疑似乱数生成アルゴリズムの実装を表内のものから選択する場合、すべての面において他よりも優れているものはない。目的を定めた上で、およそ次のように選択するのがよいだろう。
乱数の質を重視する場合
mt19937ar、長周期のSFMT、長周期のWELL(WELLのサイトからより長周期のものを得るべきである)あるいは長周期のmt-liteが、次元均等分布に優れる。
なお、いずれも暗号用途に直接使用するべきではない。
速度を重視する場合
乱数の質を度外視してよいなら、ほとんどの場合LCGが最速である。
x86アーキテクチャのSSE命令またはPowerPCアーキテクチャのAltiVec命令を使用可能ならば、SFMTがよい選択肢である。特に大量の乱数を必要とする場合は、block版を用いるのがよい。
SSEまたはAltiVecを使用できないならば、大量の乱数を生成するなら調律のないblock版mt-lite、さもなければxor128を用いるのがよいだろう。ただし、アーキテクチャによって傾向に差異があるため、実際の環境で速度を測定して選択するか、もしくは項6.3. 「実行速度」のアーキテクチャごとの測定結果に基づいて選択した方がよい。
マルチスレッド環境で用いる場合
mt-liteのいずれかを選択する必要がある。
ただ、WELL・xor128・LCGについては、実装をスレッドセーフに変更することは比較的容易である。
リアルタイム性を求める場合
WELL、xor128、LCGあるいはnonloop版mt-liteを選択するのがよい。
残りのものは応答時間が一定していないため注意を要する: 項6.4. 「最悪応答時間」を参照のこと。
使用メモリ量を抑制する場合
データサイズを抑制する場合は、長周期のものは避けるべきである。
コードサイズも抑制したい場合は、LCG、xor128、nonloop版mt-liteあるいはWELLを選択するとよいだろう。詳細は項6.5. 「使用メモリ量」を参照のこと。