在 JavaScript 中,生成不重复的随机数会带来挑战,Chrome 中的错误报告就是例证。问题中提出的函数需要改进以确保唯一的数字。
替代方法 1:随机排列
为了避免重复调用随机数函数,建议生成最初数字的随机排列。以下代码片段可针对 1 到 10 之间的数字实现此目的:
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); }
此方法消除了查找未使用的数字的处理时间延长的风险。
替代方法 2:Fisher –Yates Shuffle
可以采用一种更有效的方法,称为 Fisher–Yates Shuffle:
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]);
替代方法 3:生成器
另一种选择是利用生成器:
function* shuffle(array) { var i = array.length; while (i--) { yield array.splice(Math.floor(Math.random() * (i+1)), 1)[0]; } }
使用:
var 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 ranNums.next().value; // etc.
方法的选择取决于应用程序的具体要求和约束。
以上是如何改进 JavaScript 中的随机数生成以获得唯一且不重复的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!