#フィッシャーイェーツのアルゴリズム
ゲームを作る際に欠かせない、シャッフル機能。数ある実装法の中で恐らく最も有名で手軽な、フィッシャーイェーツのアルゴリズムを実装してみる。このアルゴリズムは、直前に入れ替わった値の1個前にある値(1周目は末尾の値)とランダムに選ばれた値を入れ替えることでシャッフルを実装していくが、一度選ばれた値を入れ替えの対象から除外することで、すべての値が入れ替えられるようになっている。
Array.prototype.shuffle = function () {
//値を入れ替えるために、3つの変数を用意。tmpは一時変数の略
let i,j,tmp;
//i--で、直前に入れ替わった値の1個前にある値を入れ替えの対象とする
for(i = this.length-1; i > 0 ;i--){
//乱数を回し、入れ替える値を選ぶ
j = Math.floor(Math.random()*(i+1));
//配列のi番目とj番目を入れ替える
tmp = this[i];
this[i] = this[j];
this[j] = tmp;
}
return this;
}
//while文の場合 *ES6で使用可能な入れ替え法を使用
Array.prototype.shuffle = function () {
let i = this.length;
while (i) {
let j = Math.floor(Math.random() * i);
[this[i--],this[j]] = [this[j],this[i--]];
}
return this;
}
1行目は、あらゆる配列でシャッフルアルゴリズムを使用可能にするために、Arryaオブジェクトにshuffleというメソッドを持たせるための記述(プロトタイププロパティにシャッフルの処理をする関数を格納する)。二つの変数の値を入れ替えるために、一時変数を用意して、入れ替えを実行する。ES6では、[this[i],this[j]] = [this[j],this[i]] の記述で一時変数を用いなくても入れ替えが可能。