首頁 >web前端 >js教程 >如何有效地從數組中選擇隨機項而不重複,特別是當數組不斷修改時?

如何有效地從數組中選擇隨機項而不重複,特別是當數組不斷修改時?

Susan Sarandon
Susan Sarandon原創
2024-11-01 17:16:02574瀏覽

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>

說明:

這種方法將隨機選擇邏輯與負責管理最近選擇陣列的程式碼隔離。因此,效率得到了提高,因為每次運行選擇器函數時,隨機選擇只發生一次。

透過在副本耗盡時重置副本,該函數保證所有項目都有相同的機會被選擇。這消除了程式碼陷入無限循環試圖找到“唯一”名稱的潛在問題。

以上是如何有效地從數組中選擇隨機項而不重複,特別是當數組不斷修改時?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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