javascript - js 生成范围内不重复的随机数。
本文介绍了javascript - 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));
};
求助各位高手啦
解决方案
无重复的小范围随机和大范围随机是不一样的,小范围随机的思想基本上是随机排序再抽取其中一部分(通常就是前面几个)。大范围随机通常是直接在范围内产生随机数,再判断是否重复。
你这个是小范围的,所以很简单,一句话
[0,1,2,3].sort(() => Math.random() - 0.5).slice(0,2)
既然 [].sort(() => Math.random() - 0.5)
这种方法产生的随机数随机性不强,可以使用 Fisher–Yates shuffle 算法来做,说起来也不是多麻烦的事情,就是随机从剩余的数里抽取一个。
翻了一下我以前的某个回答,那是随机选一部分数据,应该还是切这个题的,那个回答里有个图可以帮助理解。那个如果选完就是洗牌了。
上代码(代码中生成了一个索引数组,目的是不改变原数组数据)
const data = [0, 1, 2, 3];
const r = Array.apply(null, { length: data.length })
.map((n, i) => i)
.map((n, i, all) => {
const j = i + Math.floor(Math.random() * (all.length - i));
const v = all[j];
all[j] = n;
return v;
})
.slice(0, 2)
.map(i => {
return data[i];
});
console.log(r);
如果不要索引数组还简单些,但是会改变原数组顺序
const r = data
.map((n, i, all) => {
const j = i + Math.floor(Math.random() * (all.length - i));
const v = all[j];
all[j] = n;
return v;
})
.slice(0, 2);
这篇关于javascript - js 生成范围内不重复的随机数。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文