ホームページ >ウェブフロントエンド >jsチュートリアル >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 サイトの他の関連記事を参照してください。