JavaScript配列シャッフル 解説
JavaScriptで配列をシャッフルする方法
JavaScriptでは、配列の要素をランダムな順序に並べ替えることを「シャッフル」と呼びます。これは、さまざまなアプリケーションで有用な手法です。
Fisher-Yatesシャッフルアルゴリズム
最も一般的なシャッフルアルゴリズムの一つです。
function shuffle(array) {
let currentIndex = array.length;
// 残りの要素をシャッフルする
while (currentIndex !== 0) {
// ランダムなインデックスを取得
const randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex--;
// 現在の要素とランダムなインデックスの要素を交換
[array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];
}
return array;
}
ソート関数を利用
JavaScriptの組み込みソート関数sort()
と比較関数を組み合わせることで、配列をシャッフルすることができます。
function shuffle(array) {
return array.sort(() => Math.random() - 0.5);
}
使用例
const myArray = [1, 2, 3, 4, 5];
const shuffledArray = shuffle(myArray);
console.log(shuffledArray); // ランダムな順序の配列が出力される
注意
- 性能
シャッフルアルゴリズムの性能は、配列のサイズや使用頻度によって異なります。大規模な配列を頻繁にシャッフルする場合は、効率的なアルゴリズムを選択する必要があります。 - ランダム性
真にランダムな結果を得るためには、適切な乱数生成器を使用することが重要です。JavaScriptのMath.random()
は、擬似乱数生成器であり、特定のシーケンスを生成します。より高度なランダム性が必要な場合は、専用のライブラリを使用することもできます。
JavaScript配列シャッフルのコード解説
function shuffle(array) {
let currentIndex = array.length;
// 残りの要素をシャッフルする
while (currentIndex !== 0) {
// ランダムなインデックスを取得
const randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex--;
// 現在の要素とランダムなインデックスの要素を交換
[array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];
}
return array;
}
解説
- shuffle(array)関数
配列を受け取り、シャッフルされた配列を返します。 - currentIndex
配列の現在のインデックスを保持します。 - whileループ
currentIndex
が0になるまで繰り返します。 - Math.floor(Math.random() * currentIndex)
0からcurrentIndex - 1
までのランダムな整数を取得します。 - [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];
現在の要素とランダムなインデックスの要素を交換します。 - return array;
シャッフルされた配列を返します。
function shuffle(array) {
return array.sort(() => Math.random() - 0.5);
}
- array.sort()
配列をソートします。 - () => Math.random() - 0.5
比較関数を指定します。この関数は、ランダムな値を返すため、配列の要素をランダムな順序にソートします。
const myArray = [1, 2, 3, 4, 5];
const shuffledArray = shuffle(myArray);
console.log(shuffledArray); // ランダムな順序の配列が出力される
- myArray
シャッフルする元の配列。 - shuffle(myArray)
配列をシャッフルし、新しい配列を返します。 - console.log(shuffledArray)
シャッフルされた配列を出力します。
Lodashの_.shuffle関数
LodashはJavaScriptのユーティリティライブラリで、配列のシャッフルを含むさまざまな機能を提供します。
const _ = require('lodash');
const myArray = [1, 2, 3, 4, 5];
const shuffledArray = _.shuffle(myArray);
console.log(shuffledArray);
ES6のArray.prototype.sort()とカスタム比較関数
function shuffle(array) {
return array.sort((a, b) => 0.5 - Math.random());
}
この方法では、比較関数がランダムな値を返すため、配列の要素をランダムな順序にソートします。
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
この改良版は、インデックスの範囲をより明確に指定し、パフォーマンスを向上させることができます。
カスタムシャッフル関数
function shuffle(array) {
const shuffledArray = [];
while (array.length > 0) {
const randomIndex = Math.floor(Math.random() * array.length);
shuffledArray.push(array.splice(randomIndex, 1)[0]);
}
return shuffledArr ay;
}
この方法は、配列から要素をランダムに抽出して新しい配列を作成します。
選択基準
- ライブラリ依存性
ライブラリを使用する場合は、プロジェクトの依存関係を管理する必要があります。 - 読みやすさ
コードの読みやすさと保守性を考慮してください。 - パフォーマンス
大規模な配列を頻繁にシャッフルする場合は、効率的なアルゴリズムを選択する必要があります。
javascript arrays random