はじめに
反復せずに配列から項目をランダムに選択するのは一般的なプログラミングですタスク。ただし、アイテムのプールが常に変更されている場合、効率の確保が非常に重要になります。
質問
開発者は、配列からアイテムをランダムに選択する関数を実装しました。繰り返しを避けるために、最近の選択のリストを維持しながら。しかし、彼らはその効率性について懸念を表明し、より最適なアプローチがあるかどうかを尋ねています。
回答
1.再帰の明確化
提供されたコードは確かに再帰関数のようです。再帰にはそれ自体を呼び出す関数が含まれるため、特定のシナリオでは非効率につながる可能性があります。
2.効率の向上
効率を向上するには、次の代替アプローチを検討してください。
コードの実装:
<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']);</code>
説明:
このアプローチランダム選択ロジックを、最近の選択の配列を管理するコードから分離します。その結果、ランダムな選択がセレクター関数の実行ごとに 1 回だけ発生するため、効率が向上します。
コピーが空になるたびにコピーをリセットすることにより、関数はすべてのアイテムが選択される確率が等しいことを保証します。これにより、コードが「一意の」名前を見つけようとして無限ループに陥るという潜在的な問題が解消されます。
以上が特に配列が常に変更されている場合、繰り返しを行わずに配列からランダムな項目を効率的に選択するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。