我的需求
在 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));
};
求助各位高手啦
无重复的小范围随机和大范围随机是不一样的,小范围随机的思想基本上是随机排序再抽取其中一部分(通常就是前面几个)。大范围随机通常是直接在范围内产生随机数,再判断是否重复。
你这个是小范围的,所以很简单,一句话
既然
[].sort(() => Math.random() - 0.5)
这种方法产生的随机数随机性不强,可以使用 Fisher–Yates shuffle 算法来做,说起来也不是多麻烦的事情,就是随机从剩余的数里抽取一个。翻了一下我以前的某个回答,那是随机选一部分数据,应该还是切这个题的,那个回答里有个图可以帮助理解。那个如果选完就是洗牌了。
上代码(代码中生成了一个索引数组,目的是不改变原数组数据)
如果不要索引数组还简单些,但是会改变原数组顺序