コンテンツにスキップ

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

MathRandの結果

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

XorShiftの結果

図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)

このインジケータをチャートに入れると、黒い背景に緑の点が打たれます。

比較ポイント

  1. MathRand: 512x512のキャンバスだと、なんとなく「斜めの線」や「ムラ」が見えることがあります(※解像度や取り方による)。特に3次元(X, Y, Z)にすると顕著ですが、2次元でも点の重なり方に違和感が出ます。
  2. XorShift: 砂嵐のように均一に散らばります。

XorShiftの実装コード

C++
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座標に点を打ち、分布の均一性を確認します。

18_Random_Canvas.mq5 をダウンロード

2. 系列相関テスト(差がわかりやすい版)

連続する2つの乱数値 x[n]x[n+1] をX-Y平面にプロットします。
このテストではMathRandの弱点が顕著に現れます。

18_Random_Correlation_Test.mq5 をダウンロード

系列相関テストの見方

モード 見え方
MathRand 斜めの線状パターン(縞模様)が現れる
XorShift 均一なノイズ状に分布する

線形合同法は「連続する値に相関がある」ため、縞模様パターンが発生します。
これがモンテカルロシミュレーションなどで問題になる理由です。

なぜ基本版では差が見えにくいのか

基本版(18_Random_Canvas)では、X座標とY座標を別々の乱数呼び出しで生成しています。
線形合同法の問題は主に「連続する値の相関」にあるため、2次元散布図だけでは差が見えにくいのです。
3次元プロット系列相関テストで初めて問題が顕在化します。


関連記事・用語