ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript で再帰を行わずに非繰り返しの乱数を生成するにはどうすればよいですか?

JavaScript で再帰を行わずに非繰り返しの乱数を生成するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-20 08:02:29622ブラウズ

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

JavaScript での非反復乱数の生成

JavaScript では非反復乱数のシーケンスを生成することが困難な場合があります。代表的な問題とその解決策の内訳を次に示します。

問題:

提供されたコードは、以前の配列と照合することにより、非反復の乱数を生成しようとします。生成された数値。ただし、このアプローチでは、再帰的な関数呼び出しによりスタック オーバーフロー エラーが発生します。

最良の解決策:

連続的な再帰的な関数呼び出しの代わりに、シャッフルされた配列を生成することを検討してください。冒頭の数字。このアプローチにより、各数値が 1 回だけ生成されることが保証されます。これを効率的に実現するフィッシャー・イェーツ シャッフルは次のとおりです。

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

  while (i--) {
    j = Math.floor(Math.random() * (i + 1));
    temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }

  return array;
}

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

この手法は、元の配列内で要素を直接交換することで、コストのかかる配列操作を回避します。

別の代替案:

ジェネレーターをサポートするブラウザーの場合、次のジェネレーター関数を使用できます。

<code class="javascript">function* shuffle(array) {
  let i = array.length;

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

let 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
// etc.</code>

生成された値を利用することで、このアプローチでは実際に必要になるまで配列操作を遅らせ、より効率的に配列操作を実行できます。特定の使用例。どちらの方法を選択しても、これらのソリューションは JavaScript で非繰り返しの乱数を効果的に生成します。

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

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