我需要生成一组独一无二且在0和给定数字之间的整数。
也就是说:
var limit = 10;
var amount = 3;
我该如何使用 JavaScript 生成三个介于 1 和 10 之间的唯一数字?
我需要生成一组独一无二且在0和给定数字之间的整数。
也就是说:
var limit = 10;
var amount = 3;
我该如何使用 JavaScript 生成三个介于 1 和 10 之间的唯一数字?
Math
方法:
Math.random()
返回介于 0 和 1(包括 0,不包括 1)之间的随机数。向下舍入此数字到其最近的整数
Math.floor(Math.random()*10) + 1
示例:
//Example, including customisable intervals [lower_bound, upper_bound)
var limit = 10,
amount = 3,
lower_bound = 1,
upper_bound = 10,
unique_random_numbers = [];
if (amount > limit) limit = amount; //Infinite loop if you want more unique
//Natural numbers than exist in a
// given range
while (unique_random_numbers.length < limit) {
var random_number = Math.floor(Math.random()*(upper_bound - lower_bound) + lower_bound);
if (unique_random_numbers.indexOf(random_number) == -1) {
// Yay! new random number
unique_random_numbers.push( random_number );
}
}
// unique_random_numbers is an array containing 3 unique numbers in the given range
random_numbers
。我先放逻辑,然后是示例。 - Rob WMath.floor(Math.random() * (limit+1))
Math.random()
生成一个介于 0 和 1 之间的浮点数,Math.floor()
将其向下取整为整数。
通过将其乘以一个数字,您可以有效地使范围变为 0..number-1
。如果您希望在 num1
到 num2
的范围内生成它,请执行以下操作:
Math.floor(Math.random() * (num2-num1 + 1) + num1)
为了生成更多的数字,只需使用一个for循环,并将结果放入数组中或直接写入文档。
function generateRange(pCount, pMin, pMax) {
min = pMin < pMax ? pMin : pMax;
max = pMax > pMin ? pMax : pMin;
var resultArr = [], randNumber;
while ( pCount > 0) {
randNumber = Math.round(min + Math.random() * (max - min));
if (resultArr.indexOf(randNumber) == -1) {
resultArr.push(randNumber);
pCount--;
}
}
return resultArr;
}
Math.round(min + Math.random() * (max - min))
解决方案,并在生成了一百万个数字的测试中发现,相比于其他结果,我得到了大约一半的0
和100
实例。 - PrincessRTFMMath.floor(Math.random()*limit)+1
// assuming _ is the Lodash library
// generates `amount` numbers from 0 to `upperLimit` inclusive
function uniqueRandomInts(upperLimit, amount) {
var possibleNumbers = _.range(upperLimit + 1);
var shuffled = _.shuffle(possibleNumbers);
return shuffled.slice(0, amount);
}
for(i = 0;i <amount; i++)
{
var randomnumber=Math.floor(Math.random()*limit)+1
document.write(randomnumber)
}
function uniqueRandoms(qty, min, max){
var rnd, arr=[];
do { do { rnd=Math.floor(Math.random()*max)+min }
while(arr.includes(rnd))
arr.push(rnd);
} while(arr.length<qty)
return arr;
}
//generate 5 unique numbers between 1 and 10
console.log( uniqueRandoms(5, 1, 10) );
...以及相同功能的压缩版本:
function uniqueRandoms(qty, min, max) { var a = []; do { do { r = Math.floor(Math.random() * max) + min } while (a.includes(r)); a.push(r) } while (a.length < qty); return a }
uniqueRandoms(10, 2, 5)
会导致无限循环。 - Jeremy Iglehart类似这样的东西
var limit = 10;
var amount = 3;
var nums = new Array();
for(int i = 0; i < amount; i++)
{
var add = true;
var n = Math.round(Math.random()*limit + 1;
for(int j = 0; j < limit.length; j++)
{
if(nums[j] == n)
{
add = false;
}
}
if(add)
{
nums.push(n)
}
else
{
i--;
}
}
var randomNums = function(amount, limit) {
var result = [],
memo = {};
while(result.length < amount) {
var num = Math.floor((Math.random() * limit) + 1);
if(!memo[num]) { memo[num] = num; result.push(num); };
}
return result; }
while
循环中的条件更改为类似于while(result.length < amount && result.length <= max - 1)
的内容。 - ViRPo类似于@rory-okane的答案,但不使用lodash。
时间复杂度和空间复杂度均为O(n)
,其中n=limit
具有一致的运行时间
支持正数或负数范围
理论上,它应该支持从0
到±2^32 - 1
的范围
这个限制是由于Javascript数组只支持2^32 - 1
索引,根据ECMAScript规范
我在10^8
处停止测试,因为我的浏览器在这里变得奇怪,只能处理负数到-10^7
,我得到了一个Uncaught RangeError: Invalid array length
错误(耸肩)
额外功能:如果您只传递一个参数,则生成长度为n
、范围为0
到limit
的随机数组
let uniqueRandomNumbers = (limit, amount = limit) => {
let array = Array(Math.abs(limit));
for (let i = 0; i < array.length; i++) array[i] = i * Math.sign(limit);
let currentIndex = array.length;
let randomIndex;
while(currentIndex > 0) {
randomIndex = Math.floor(Math.random() * currentIndex--);
[array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];
}
return array.slice(0, Math.abs(amount));
}
console.log(uniqueRandomNumbers(10, 3));
console.log(uniqueRandomNumbers(-10, 3));
//bonus feature:
console.log(uniqueRandomNumbers(10));
我个人之所以来到这里,是因为我想生成长度为n
的随机数组。以下是其他SO问题,它们帮助我找到了自己的用例答案。感谢大家的贡献,你们让我的生活变得更美好。