此任务的目标是生成指定范围内不重复的随机数序列。一种方法涉及根据先前创建的号码列表检查每个生成的号码。然而,由于过度递归,此方法可能会导致“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中文网其他相关文章!