栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在JS中生成非重复随机数

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在JS中生成非重复随机数

如果我理解正确,那么您只是在寻找数字1-10的排列(即随机无重复的数字)?也许一开始尝试一次生成这些数字的随机列表,然后按照自己的方式进行操作?

这将计算中的数字的随机排列

nums

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);}

因此,例如,如果您要寻找介于1到20之间也是偶数的随机数,则可以使用:

nums = [2,4,6,8,10,12,14,16,18,20];

然后只需通读

ranNums
即可调出随机数。

正如您在方法中发现的那样,这样做不会冒花费更长的时间查找未使用的数字的风险。

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]);

基本上,通过避免使用“昂贵”的数组操作,它会更加高效。

奖励编辑
:另一种可能性是使用生成器(假设您有支持):

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 arrayranNums.next().value;    // second random number from arrayranNums.next().value;    // etc.

在您对改组后的数组中的所有元素进行遍历后,

ranNums.next().value
最终结果将为
undefined

总体而言,这不会像Fisher-YatesShuffle那样高效,因为您仍在添加

splice
数组。但是不同之处在于,您现在仅在需要时才进行该工作,而不是全部先进行,因此根据您的用例,这可能会更好。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/596796.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号