[MQL] 配列の要素をランダムにソートする方法

MQLで配列の要素をランダムにソートする方法を説明します。

ランダムソートのやり方概要

配列の要素をランダムソートする方法はざっくりと下の図のようになります。

ランダムソートの概要

  1. 配列の要素0~4からランダムに選択し、値をtempに保持
  2. 要素4の値を要素2に移動し、tempの値を要素4に移動(要素4はこれで確定とする)
  3. 配列の要素0~3からランダムに選択し、値をtempに保持
  4. 要素3の値を要素1に移動し、tempの値を要素3に移動(要素3はこれで確定とする)

ランダムに選んだ要素を配列の最後に移動し、ランダムの範囲を一つ狭めて再びランダム選出して最後尾に移動という処理を繰り返すことで要素をランダムにソートする方法です。

上記の図では①②のサイクルをあと3回繰り返すと配列のすべての要素のランダムソートが完了します。

プログラムの手順

具体的なプログラムの書き方は下記の通り。

1. シードを設定する

まずはMathRand()関数を使用するためにOnInit()関数内でMathSrand()を呼び出してシードを設定しておく。

int OnInit()
{
  MathSrand(GetTickCount());
  return(INIT_SUCCEEDED);
}

2. 関数を作成する

要素をランダムに入れ替える関数を作成する。下記は最もシンプルな場合のコード例。引数の&array[]は参照渡しであることに注意。

//+------------------------------------------------------------------+
void RandomSortArray(int &array[]){
   //array[]の要素をランダムに並べ直す
   int i;
   int max_i;
   int temp; //要素の一時退避に使用 要素のデータ型と同じ型で宣言する
   max_i = ArraySize(array) - 1;
   while(max_i > 0){
      i = MathRand() % (max_i + 1); // 0からmax_iまでの整数をランダムに取得(i)
      temp = array[i];              // array[i]の要素をtempに一時退避
      array[i] = array[max_i];      // array[i]にarray[max_i]を入れる。
      array[max_i] = temp;          // array[max_i]に一時退避させた値を入れる
      max_i--;                      // ランダム取得の範囲を一つ狭める
   }
}

上の関数は要素数がゼロの場合はエラーになりますので必要に応じてエラー回避処理を入れてください。

3. 関数を呼び出す

あとはプログラム中で下記のように関数を呼び出せば要素がランダムにソートされます。

RandomSortArray(array_name);

引数のarray_nameのところには、ソートしたい配列の名前を入れます。配列は事前に作成しておきます。

まとめ

配列の要素をランダムに入れ替える関数の書き方を説明しました。

コメント

この記事へのコメント(0 件)