首頁  >  文章  >  web前端  >  如何有效率、不重複地隨機選擇數組項?

如何有效率、不重複地隨機選擇數組項?

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 的陣列 slice() 方法建立原始陣列的淺表副本。然後,它重複地從副本中選擇隨機項目並將其從副本中刪除,從而有效地模仿隨機選擇,而不重複,直到所有項目都用完為止。一旦選擇了所有項目,副本就會重置,從而可以重新開始隨機選擇。

以上是如何有效率、不重複地隨機選擇數組項?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn