ホームページ > 記事 > ウェブフロントエンド > 反復せずにランダムな配列項目を効率的に選択するにはどうすればよいでしょうか?
繰り返しのない配列項目の効率的なランダム選択
この記事では、ランダムに選択する効率的な方法を求めるユーザーが直面する問題について検討します。繰り返しのない配列からの項目。提供されたコードは項目を効果的に選択しますが、再帰関数の使用により無限ループの可能性が生じます。
Recursive Function?
関数chooseName()は次のことができます。定義内でそれ自体を参照するため、再帰的であるとみなされます。終了条件は、一意の項目の検出であり、一意が false に設定され、ループが中断され、関数呼び出しが新たに開始されます。
効率の向上
強化するには効率性を考慮して、コメント投稿者 @YuriyGalanter が提案した代替アプローチを検討します。再帰関数に依存する代わりに、配列から項目をランダムに選択し、それらを一時配列に保存できます。すべての項目が選択されたら、一時配列をリセットし、ランダム選択プロセスを続行します。
実装
以下の実装には、このアプローチが組み込まれています。
<code class="javascript">function randomNoRepeats(array) { var copy = array.slice(0); return function() { if (copy.length < 1) { copy = array.slice(0); } var index = Math.floor(Math.random() * copy.length); var item = copy[index]; copy.splice(index, 1); return item; }; } var chooser = randomNoRepeats(['Foo', 'Bar', 'Gah']); chooser(); // => "Bar" chooser(); // => "Foo" chooser(); // => "Gah" chooser(); // => "Foo" -- only repeats once all items are exhausted.</code>
この機能を利用すると、繰り返しの問題を回避しながら、無限ループの可能性なしにアイテムをランダムに選択できます。
以上が反復せずにランダムな配列項目を効率的に選択するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。