ホームページ > ウェブフロントエンド > jsチュートリアル > Fisher-Yates アルゴリズムを使用して JavaScript で配列を効率的にシャッフルするにはどうすればよいですか?

Fisher-Yates アルゴリズムを使用して JavaScript で配列を効率的にシャッフルするにはどうすればよいですか?

DDD
リリース: 2024-12-27 21:24:17
オリジナル
411 人が閲覧しました

How Can I Efficiently Shuffle an Array in JavaScript Using the Fisher-Yates Algorithm?

Fisher-Yates アルゴリズムを使用した効率的な配列シャッフル

JavaScript では、配列シャッフルはランダム化やゲーム開発でよく使用される一般的な操作です。配列を効果的にシャッフルするために、一般的なフィッシャー・イェーツ アルゴリズムが効率的なアプローチを提供します。

フィッシャー・イェーツ アルゴリズムの実装

このアルゴリズムの背後にある中心原理には、配列の要素をランダムに選択された要素と繰り返し交換することが含まれます。要素。このプロセスは、すべての要素が交換されるまで続きます。次のコードはこのアルゴリズムを実装しています:

/**
 * Shuffles an array in place.
 * @param {Array} a Array containing the elements to be shuffled.
 */
function shuffle(a) {
    for (let i = a.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [a[i], a[j]] = [a[j], a[i]];
    }
    return a;
}
ログイン後にコピー

ES6 バージョン

ES6 では、構造化代入を使用してコードを簡素化できます:

/**
 * Shuffles an array in place. ES6 version.
 * @param {Array} a Array containing the elements to be shuffled.
 */
function shuffle(a) {
    for (let i = a.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [a[i], a[j]] = [a[j], a[i]];
    }
    return a;
}
ログイン後にコピー

配列プロトタイプの実装

コードの可読性を高めるために、シャッフル機能をプロトタイプ メソッドとして追加できます。 arrays:

Object.defineProperty(Array.prototype, 'shuffle', {
    value: function() {
        for (let i = this.length - 1; i > 0; i--) {
            const j = Math.floor(Math.random() * (i + 1));
            [this[i], this[j]] = [this[j], this[i]];
        }
        return this;
    }
});
ログイン後にコピー

これにより、arr.shuffle() を呼び出すだけで、arr という名前の配列をシャッフルできます。

使用例

シャッフル関数を利用するには、次のようにします。次のような要素の配列を入力として提供できます。

let myArray = ['1', '2', '3', '4', '5', '6', '7', '8', '9'];
shuffle(myArray);
ログイン後にコピー

シャッフル関数は要素をランダムに再配置します。 myArray 内。この関数は、ランダム化されたデータやゲーム内のカードのシャッフルが必要なシナリオで特に役立ちます。

以上がFisher-Yates アルゴリズムを使用して JavaScript で配列を効率的にシャッフルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート