如何使用 JavaScript生成1 到 100 之间的一些唯一随机数?
生成 1 到 100 之间的唯一随机数
IT技术
javascript
random
integer
numbers
2021-01-19 06:22:36
6个回答
例如:要生成 8 个唯一的随机数并将它们存储到一个数组中,您可以简单地执行以下操作:
var arr = [];
while(arr.length < 8){
var r = Math.floor(Math.random() * 100) + 1;
if(arr.indexOf(r) === -1) arr.push(r);
}
console.log(arr);
- 用数字 1 到 100 填充数组。
- 洗牌吧。
- 取结果数组的前 8 个元素。
使用Set 的现代 JS 解决方案(和平均情况 O(n))
const nums = new Set();
while(nums.size !== 8) {
nums.add(Math.floor(Math.random() * 100) + 1);
}
console.log([...nums]);
另一种方法是生成一个 100 项的数组,并随机排序。这实际上导致了一个非常短且(在我看来)简单的片段。
const numbers = Array(100).fill().map((_, index) => index + 1);
numbers.sort(() => Math.random() - 0.5);
console.log(numbers.slice(0, 8));
生成100 个数字的排列,然后依次选择。
使用Knuth Shuffle(又名 Fisher-Yates shuffle)算法。
JavaScript:
function fisherYates ( myArray,stop_count ) {
var i = myArray.length;
if ( i == 0 ) return false;
int c = 0;
while ( --i ) {
var j = Math.floor( Math.random() * ( i + 1 ) );
var tempi = myArray[i];
var tempj = myArray[j];
myArray[i] = tempj;
myArray[j] = tempi;
// Edited thanks to Frerich Raabe
c++;
if(c == stop_count)return;
}
}
编辑:
改进的代码:
function fisherYates(myArray,nb_picks)
{
for (i = myArray.length-1; i > 1 ; i--)
{
var r = Math.floor(Math.random()*i);
var t = myArray[i];
myArray[i] = myArray[r];
myArray[r] = t;
}
return myArray.slice(0,nb_picks);
}
潜在问题:
假设我们有 100 个数字的数组 {例如 [1,2,3...100]},并且我们在 8 次交换后停止交换;那么大多数时间数组看起来像 {1,2,3,76,5,6,7,8,...这里的数字将被洗牌...10}。
因为每个数字都会以 1/100 的概率交换所以概率。交换前 8 个数字是 8/100 而概率。交换其他 92 是 92/100。
但是,如果我们为完整数组运行算法,那么我们可以确定(几乎)每个条目都被交换了。
否则我们将面临一个问题:选择哪 8 个号码?