js 生成范围内不重复的随机数。
我的需求
在 0 - 3 之间(包含0与3)生成 2 个不重复
的随机数。
我的方案
我没有使用do while
的方案来做...
function randomNumbers($range){
return $range[0] + Math.round(Math.random() * ($range[1] - $range[0]));
}
// 生成随机数字
function generatedRandomNumbers($length,$range){
var _randomNumber = randomNumbers($range),
_array = [];
for(var i = 0;i < $length;i++){
if(~_array.indexOf(_randomNumber)){
_randomNumber = randomNumbers($range);
}
_array[i] = _randomNumber;
}
console.log(JSON.stringify(_array));
};
求助各位高手啦
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
随手写了一个,但缺陷在于如果要显示1~100范围内随机且不同的100个数值,这种算法的效率很慢。所以最好是数池排除法+这种,通过计算max-min / num是否大于50%来切换两种算法,提高效率。
昨天也看到了一个类似的问题,处理的不是很好,但是可以得到结果。
理解错误,忽略答案吧
随手
无重复的小范围随机和大范围随机是不一样的,小范围随机的思想基本上是随机排序再抽取其中一部分(通常就是前面几个)。大范围随机通常是直接在范围内产生随机数,再判断是否重复。
你这个是小范围的,所以很简单,一句话
既然
[].sort(() => Math.random() - 0.5)
这种方法产生的随机数随机性不强,可以使用 Fisher–Yates shuffle 算法来做,说起来也不是多麻烦的事情,就是随机从剩余的数里抽取一个。翻了一下我以前的某个回答,那是随机选一部分数据,应该还是切这个题的,那个回答里有个图可以帮助理解。那个如果选完就是洗牌了。
上代码(代码中生成了一个索引数组,目的是不改变原数组数据)
如果不要索引数组还简单些,但是会改变原数组顺序