【问题标题】:I need to make an array of 15 random integers. I have a function but dont want numbers to repeat我需要制作一个由 15 个随机整数组成的数组。我有一个功能,但不希望数字重复
【发布时间】:2018-02-04 15:13:10
【问题描述】:
我正在为学校做一个项目。我需要在 1 和 50 之间生成 15 个随机整数的数组。我有一个函数,但我不希望数字重复。 (例如,如果数字 3 位于索引 0 处,我不希望它再次出现在数组中。)如果我能得到一些关于不重复数字的帮助,那就太好了。
感谢您的帮助!
var arr;
function genArray() {
//generates random array
arr = [];
for (var i = 0; i < 15; i++) {
var min = 1;
var max = 50;
var arrayValue = Math.floor(Math.random() * (max - min + 1)) + min;
arr.push(arrayValue);
}
arr.sort(function(a, b) {
return a - b
});
console.log(arr);
}
【问题讨论】:
标签:
javascript
arrays
random
repeat
【解决方案1】:
在循环中生成一个新的随机数,而该数在数组中。换句话说,只有当新数字不在数组中时才继续。
var arr;
function genArray() {
//generates random array
arr = [];
for (var i = 0; i < 15; i++) {
var min = 1;
var max = 50;
do
{
var arrayValue = Math.floor(Math.random() * (max - min + 1)) + min;
}while(arr.includes(arrayValue))
arr.push(arrayValue);
}
arr.sort(function(a, b) {
return a - b
});
console.log(arr);
}
genArray();
【解决方案2】:
您可以创建一个函数来检查数字是否已经在数组中,而不是重新生成数字,否则将数字推送到数组中
var arr;
function genArray() {
//generates random array
arr = [];
for (var i = 0; i < 15; i++) {
var min = 1;
var max = 50;
var arrayValue = Math.floor(Math.random() * max) + min;
if(checkno(arrayValue)==true)
arr.push(arrayValue);
}
arr.sort(function(a, b) {
return a - b
});
console.log(arr);
}
function checkno(var no)
{
for(var i=0;i<arr.length;i++)
{
if(arr[i]==no)
return false;
else
return true;
}
}
【解决方案3】:
另一种解决方案涉及Set object,集合只有唯一元素,相同值的多个元素被忽略。
为此用途实现的集合对象示例:
var temp = new Set();
while (temp.size < 15) {
var min = 1;
var max = 50;
temp.add(Math.floor(Math.random()*(max-min+1))+min);
}
【解决方案4】:
这种方法使用箭头函数,forEach 和 includes 函数。
let LENGTH = 15;
let numbers = new Array(LENGTH).fill();
let findRandomNumber = (i) => {
let rn;
while (numbers.includes((rn = Math.floor(Math.random() * 50) + 1))) {}
numbers[i] = rn;
};
numbers.forEach((_, i) => findRandomNumber(i));
console.log(numbers.sort((a, b) => a - b));
.as-console-wrapper {
max-height: 100% !important
}
【解决方案5】:
您无需检查结果数组并重新生成数字。效率不高。
请看下面的sn-p:
function get_N_rand(N = 15, min = 1, max = 50) { // set default values
var N_rand = [], range = [];
for (var i = min; i <= max;) range.push(i++); // make array [min..max]
while (N_rand.length < N) { // cut element from [min..max] and put it into result
var rand_idx = ~~(Math.random() * range.length);
N_rand.push(range.splice(rand_idx, 1)[0]);
}
return N_rand;
}
console.log(JSON.stringify( get_N_rand() )); // run with defaults
console.log(JSON.stringify( get_N_rand(6, 10, 80) )); // run with arbitraries