此任務的目標是產生指定範圍內不重複的隨機數序列。一種方法涉及根據先前建立的號碼清單檢查每個產生的號碼。然而,由於過度遞歸,此方法可能會導致“RangeError”。
更好的解決方案是預先產生所需數字的隨機排列。這可以使用各種技術來實現:
<code class="javascript">var nums = [1,2,3,4,5,6,7,8,9,10], ranNums = [], i = nums.length, j = 0; while (i--) { j = Math.floor(Math.random() * (i+1)); ranNums.push(nums[j]); nums.splice(j,1); }</code>
此演算法產生 nums 中數字的隨機排序。如果要限制範圍或指定偶數,可以相應地修改 nums。
<code class="javascript">function shuffle(array) { var i = array.length, j = 0, temp; while (i--) { j = Math.floor(Math.random() * (i+1)); // swap randomly chosen element with current element temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; } var ranNums = shuffle([1,2,3,4,5,6,7,8,9,10]);</code>
Fisher-Yates Shuffle 是比隨機更有效率的替代方案排列方法,因為它避免了使用昂貴的陣列操作。
<code class="javascript">function* shuffle(array) { var i = array.length; while (i--) { yield array.splice(Math.floor(Math.random() * (i+1)), 1)[0]; } }</code>
生成器提供了更動態的選項。透過利用yield和next方法,您可以按需存取打亂的數字,而無需預先產生整個序列。
這種方法在您需要大量隨機數字並希望避免的情況下特別有用將它們一次性全部記在記憶中。
以上是如何在 JavaScript 中產生不重複的隨機數而不使用遞歸的詳細內容。更多資訊請關注PHP中文網其他相關文章!