ホームページ  >  記事  >  ウェブフロントエンド  >  配列項目を反復せずに効率的にランダムに選択するにはどうすればよいですか?

配列項目を反復せずに効率的にランダムに選択するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-31 03:54:01681ブラウズ

How to Efficiently Select Array Items Randomly Without Repetition?

反復せずに配列項目をランダムに効率的に選択する

最近の選択が繰り返されないように、配列から項目をランダムに選択する関数を考案しました。現在のソリューションは効果的に機能しますが、その効率性と過剰なループにつながる可能性について懸念があります。より効率的なアプローチを検討してみましょう。

1.再帰に関する考慮事項

はい、chooseName() 関数は、一意の名前が見つかるまで自分自身を呼び出すため、再帰的であると考えることができます。再帰は特定の問題に役立つ場合がありますが、スタックの使用量と過剰な深さの可能性に注意することが重要です。

2.効率的なソリューション

効率性の問題に対処するために、別の戦略を採用できます。再帰に頼って一意の名前が見つかるまでループする代わりに、元の配列のコピーを作成し、すべての項目が選択されるまでそのコピーから項目をランダムに選択できます。すべての項目が使い果たされたら、コピーを元の状態にリセットします。

このアプローチの JavaScript 実装は次のとおりです。

<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']);
console.log(chooser()); // => "Bar"
console.log(chooser()); // => "Foo"
console.log(chooser()); // => "Gah"
console.log(chooser()); // => "Foo" -- only repeats once all items are exhausted.</code>

このアプローチでは、JavaScript の array slide() メソッドを利用して、元の配列の浅いコピーを作成します。次に、コピーからランダムなアイテムを繰り返し選択してコピーから削除し、すべてのアイテムが使い果たされるまで繰り返しのないランダムな選択を効果的に模倣します。すべてのアイテムを選択すると、コピーがリセットされ、ランダムな選択を再び開始できるようになります。

以上が配列項目を反復せずに効率的にランダムに選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。