JavaScript での乱数生成を改善して、重複しない固有の結果を得るにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-20 07:59:01
オリジナル
937 人が閲覧しました

How to Improve Random Number Generation in JavaScript for Unique and Non-Repeating Results?

JavaScript での一意の乱数の生成

JavaScript では、Chrome のエラー レポートに代表されるように、非反復乱数を生成することが課題となります。質問で示されている関数には、一意の数値を確保するための改善が必要です。

代替アプローチ 1: ランダム順列

乱数関数を繰り返し呼び出すことを避けるために、次のように生成することをお勧めします。最初は数字がランダムに並べられます。次のコード スニペットは、1 ~ 10 の数値に対してこれを実現します。

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);
}
ログイン後にコピー

このアプローチにより、未使用の数値を見つけるために処理時間が長くなるリスクが排除されます。

代替アプローチ 2: Fisher –Yates Shuffle

Fisher–Yates Shuffle として知られるより効率的な方法を使用できます。

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]);
ログイン後にコピー

代替アプローチ 3: ジェネレーター

もう 1 つのオプションは、ジェネレーターを利用することです:

function* shuffle(array) {

    var i = array.length;

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

}
ログイン後にコピー

使用方法:

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

ranNums.next().value;    // first random number from array
ranNums.next().value;    // second random number from array
ranNums.next().value;    // etc.
ログイン後にコピー

アプローチの選択は、アプリケーションの特定の要件と制約によって異なります。

以上がJavaScript での乱数生成を改善して、重複しない固有の結果を得るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!