您設計了一個從數組中隨機選擇項目的函數,確保最近的選擇不會重複。雖然目前的解決方案有效,但您擔心其效率以及是否會導致過度循環。讓我們探索一種更有效的方法。
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中文網其他相關文章!