特に配列が常に変更されている場合、繰り返しを行わずに配列からランダムな項目を効率的に選択するにはどうすればよいでしょうか?

Susan Sarandon
リリース: 2024-11-01 17:16:02
オリジナル
492 人が閲覧しました

How can I efficiently select random items from an array without repetition, especially when the array is constantly being modified?

配列からの効率的なランダム選択

はじめに

反復せずに配列から項目をランダムに選択するのは一般的なプログラミングですタスク。ただし、アイテムのプールが常に変更されている場合、効率の確保が非常に重要になります。

質問

開発者は、配列からアイテムをランダムに選択する関数を実装しました。繰り返しを避けるために、最近の選択のリストを維持しながら。しかし、彼らはその効率性について懸念を表明し、より最適なアプローチがあるかどうかを尋ねています。

回答

1.再帰の明確化

提供されたコードは確かに再帰関数のようです。再帰にはそれ自体を呼び出す関数が含まれるため、特定のシナリオでは非効率につながる可能性があります。

2.効率の向上

効率を向上するには、次の代替アプローチを検討してください。

  1. 元の配列のコピーを作成します。 これにより、元の配列が確実にコピーされます。そのまま残ります。
  2. コピーからアイテムをランダムに選択する関数を定義します。
  3. コピーが使い果たされたら、から新しいコピーを作成してリセットします。元の配列。

コードの実装:

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

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