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

Patricia Arquette
リリース: 2024-10-20 08:02:29
オリジナル
533 人が閲覧しました

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 サイトの他の関連記事を参照してください。

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