【検証#18】MathRandの乱数は偏っている?XorShiftとの比較¶

図1:MathRandによる分布(縞模様が見える)

図2:XorShiftによる分布(均一)
この記事の3行まとめ
- 🎲 MT4/MT5標準の
MathRand()は古いアルゴリズム(線形合同法)を使用している - 🦓 大量に発生させると分布に規則性(縞模様)が現れ、精密なシミュレーションには不向き
- 🚀 XorShift などの高品質な擬似乱数生成アルゴリズムを使おう
はじめに¶
この記事は、「とあるMetaTraderの備忘秘録」様のブログ記事を検証・紹介するシリーズの第18弾です。
「ランダムにエントリーするEA」を作ったり、モンテカルロシミュレーションを行う際、乱数の「質」を気にしたことはあるでしょうか? 実は標準関数には意外な落とし穴があります。
元ネタ
XorShift による乱数生成
https://fai-fx.hatenadiary.org/entry/20130127/1359261884
(2013年1月27日 公開)
MathRandの弱点¶
MathRand() は一般的に 線形合同法 という計算式で乱数を作ります。 これは計算が非常に高速ですが、「多次元でプロットすると、点が平面(縞模様)上に並んでしまう」 という致命的な欠点があります(Spectral test)。
32768回(2の15乗)程度の周期しかないため、数万回のバックテストを行うと同じパターンがループしてしまいます。
高品質乱数:XorShift¶
FAI氏が紹介した XorShift は、ビット演算(XORとビットシフト)だけで構成され、非常に高速かつ、周期が長く(2の128乗など)、統計的な性質も良好です。
MQL5での検証コード¶
論より証拠。チャート上に10万個の点を「ランダムに」打ってみましょう。
ファイル名: 18_Random_Canvas.mq5
保存先: MQL5\Indicators
パラメータ: UseXorShift (False=MathRand, True=XorShift)
このインジケータをチャートに入れると、黒い背景に緑の点が打たれます。
比較ポイント¶
- MathRand: 512x512のキャンバスだと、なんとなく「斜めの線」や「ムラ」が見えることがあります(※解像度や取り方による)。特に3次元(X, Y, Z)にすると顕著ですが、2次元でも点の重なり方に違和感が出ます。
- XorShift: 砂嵐のように均一に散らばります。
XorShiftの実装コード¶
int XorShift()
{
static uint x = 123456789;
static uint y = 362436069;
static uint z = 521288629;
static uint w = 88675123;
uint t = x ^ (x << 11);
x = y; y = z; z = w;
w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
return (int)(w & 0x7FFFFFFF);
}
EAで乱数を使うなら、とりあえずこれをコピペして使うのが「通」のやり方です。
MQL検証シリーズ・完結¶
第1弾の「Double型の比較」から始まり、第19弾の「乱数」まで、FAI-FXブログの分析を通じてMQLの深い世界を旅してきました。 2010年当時の知見がいまだに色褪せないのは驚異的です。
これらの知見が、皆様のEA開発の一助となれば幸いです。
ソースコードのダウンロード¶
この記事で紹介したコードをダウンロードできます。
ファイルの種類:インジケータ
保存先: MQL5/Indicators/ フォルダ
使い方: MT5のナビゲーターから「インディケータ」を展開し、チャートにドラッグ&ドロップで適用
1. 散布図テスト(基本版)¶
ランダムなX-Y座標に点を打ち、分布の均一性を確認します。
2. 系列相関テスト(差がわかりやすい版)¶
連続する2つの乱数値 x[n] と x[n+1] をX-Y平面にプロットします。
このテストではMathRandの弱点が顕著に現れます。
18_Random_Correlation_Test.mq5 をダウンロード
系列相関テストの見方
| モード | 見え方 |
|---|---|
| MathRand | 斜めの線状パターン(縞模様)が現れる |
| XorShift | 均一なノイズ状に分布する |
線形合同法は「連続する値に相関がある」ため、縞模様パターンが発生します。
これがモンテカルロシミュレーションなどで問題になる理由です。
なぜ基本版では差が見えにくいのか
基本版(18_Random_Canvas)では、X座標とY座標を別々の乱数呼び出しで生成しています。
線形合同法の問題は主に「連続する値の相関」にあるため、2次元散布図だけでは差が見えにくいのです。
3次元プロットや系列相関テストで初めて問題が顕在化します。