ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript で再帰を行わずに非繰り返しの乱数を生成する方法

JavaScript で再帰を行わずに非繰り返しの乱数を生成する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-10-20 08:03:29307ブラウズ

How to Generate Non-Repeating Random Numbers in JavaScript without Recursion

JavaScript での非反復乱数の生成

このタスクの目標は、指定された範囲内で反復しない一連の乱数を生成することです。 1 つのアプローチには、生成された各数値を以前に作成された数値のリストと照合することが含まれます。ただし、この方法では過度の再帰により「RangeError」が発生する可能性があります。

より良い解決策は、事前に必要な数値のランダムな並べ替えを生成することです。これは、さまざまな手法を使用して実現できます。

ランダム順列

<code class="javascript">var nums = [1,2,3,4,5,6,7,8,9,10],
    ranNums = [],
    i = nums.length,
    j = 0;

while (i--) {
    j = Math.floor(Math.random() * (i+1));
    ranNums.push(nums[j]);
    nums.splice(j,1);
}</code>

このアルゴリズムは、nums 内の数値のランダムな順序を生成します。範囲を制限したい場合、または偶数を指定したい場合は、それに応じて数値を変更できます。

Fisher-Yates Shuffle

<code class="javascript">function shuffle(array) {
    var i = array.length,
        j = 0,
        temp;

    while (i--) {

        j = Math.floor(Math.random() * (i+1));

        // swap randomly chosen element with current element
        temp = array[i];
        array[i] = array[j];
        array[j] = temp;

    }

    return array;
}

var ranNums = shuffle([1,2,3,4,5,6,7,8,9,10]);</code>

Fisher-Yates Shuffle は、ランダムよりも効率的な代替手段です。

ジェネレーター

<code class="javascript">function* shuffle(array) {

    var i = array.length;

    while (i--) {
        yield array.splice(Math.floor(Math.random() * (i+1)), 1)[0];
    }

}</code>

ジェネレーターは、さらに動的なオプションを提供します。 yield メソッドと next メソッドを利用すると、シーケンス全体を事前に生成することなく、オンデマンドでシャッフルされた数値にアクセスできます。

このアプローチは、大量の乱数が必要で乱数を避けたい場合に特に便利です。それらすべてを一度にメモリに保持します。

以上がJavaScript で再帰を行わずに非繰り返しの乱数を生成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。