在 JavaScript 中生成非重复随机数序列可能是一个挑战。以下是一个代表性问题及其解决方案的细分。
问题:
提供的代码尝试通过检查先前的数组来生成不重复的随机数生成的数字。然而,这种方法会因递归函数调用而触发堆栈溢出错误。
最佳解决方案:
不要连续递归函数调用,而是考虑生成一个打乱数组一开始的数字。这种方法确保每个数字仅生成一次。这是一种高效实现此目的的 Fisher–Yates Shuffle:
<code class="javascript">function shuffle(array) { let i = array.length; let j = 0; let temp; while (i--) { j = Math.floor(Math.random() * (i + 1)); temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; } let ranNums = shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);</code>
该技术通过直接在原始数组中交换元素来避免昂贵的数组操作。
另一种替代方案:
对于支持生成器的浏览器,您可以使用以下生成器函数:
<code class="javascript">function* shuffle(array) { let i = array.length; while (i--) { yield array.splice(Math.floor(Math.random() * (i + 1)), 1)[0]; } } let ranNums = shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); ranNums.next().value; // first random number from array ranNums.next().value; // second random number from array // etc.</code>
通过利用生成值,此方法会延迟数组操作,直到实际需要它们为止,从而使其更高效某些用例。无论您选择哪种方法,这些解决方案都能有效地在 JavaScript 中生成不重复的随机数。
以上是如何在 JavaScript 中生成不重复的随机数而不使用递归?的详细内容。更多信息请关注PHP中文网其他相关文章!