在0到'x'之间生成唯一的随机数(整数)

我需要生成一组唯一的(不重复的)整数,以及0和给定的数字之间。

那是:

var limit = 10; var amount = 3; 

我如何使用Javascript生成1到10之间的3个唯一的数字?

使用基本的Math方法:

  • Math.random()返回0到1之间的随机数(包括0,不包括1)。
  • 将这个数字乘以所需的最高数字(例如10)
  • 围绕这个数字

     Math.round(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 existemt in a // given range while (unique_random_numbers.length < limit) { var random_number = Math.round(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 
 Math.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; } 

根据需要的范围,返回整数的方法可以改变为: ceil (a,b), round [a,b], floor [a,b),(a,b)地板。

 Math.floor(Math.random()*limit)+1 

像这样的东西

 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--; } } 
 for(i = 0;i <amount; i++) { var randomnumber=Math.floor(Math.random()*limit)+1 document.write(randomnumber) } 

这是确保数字是唯一的另一种algorithm:

  1. 生成从0到x的所有数字的数组
  2. 随机sorting数组,使元素随机排列
  3. 挑第一个

与生成随机数的方法相比,直到获得唯一的方法,该方法使用更多的内存,但它具有更稳定的运行时间 – 结果保证在有限时间内find。 如果上限相对较低或者所需的金额相对较高,则此方法效果更好。

为了简单起见,我的答案使用了Lodash库,但是您也可以在没有这个库的情况下实现上述的algorithm。

 // 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); } 

正如所指出的,接受的答案是错误的。 这是一个非重复伪数字发生器,几乎没有内存影响,没有O(n)问题,对于10,000,000个数字来说是好的。

下面是一个演示下面的非重复仿真随机生成器的JavaScript端口plunkr在这里findgithub.com/preshing/RandomSequence 。

 var RandomSequenceOfUnique = (function() { function RandomSequenceOfUnique(seedBase, seedOffset) { var prime = 4294967291, residue, permuteQPR = function(x) { if (x >= prime) return x; residue = (x * x) % prime; return (x <= prime / 2) ? residue : prime - residue; } this.next = function() { return permuteQPR((permuteQPR(this.index++) + this.intermediateOffset) ^ 0x5bf03635); } this.index = permuteQPR(permuteQPR(seedBase) + 0x682f0161); this.intermediateOffset = permuteQPR(permuteQPR(seedOffset) + 0x46790905); } return RandomSequenceOfUnique; }()); 

构build一个实例并生成一个数字:

 var generator = new RandomSequenceOfUnique(Date.now(), parseInt(Math.random() * 10000)); 

发电机的使用:

  var num = generator.next(); 

这里有一篇文章解释生成器后面的math, 如何生成一个唯一的随机整数序列

 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; } 

这似乎工作,并不断查找重复。

 /** * Generates an array with numbers between * min and max randomly positioned. */ function genArr(min, max, numOfSwaps){ var size = (max-min) + 1; numOfSwaps = numOfSwaps || size; var arr = Array.apply(null, Array(size)); for(var i = 0, j = min; i < size & j <= max; i++, j++) { arr[i] = j; } for(var i = 0; i < numOfSwaps; i++) { var idx1 = Math.round(Math.random() * (size - 1)); var idx2 = Math.round(Math.random() * (size - 1)); var temp = arr[idx1]; arr[idx1] = arr[idx2]; arr[idx2] = temp; } return arr; } /* generating the array and using it to get 3 uniques numbers */ var arr = genArr(1, 10); for(var i = 0; i < 3; i++) { console.log(arr.pop()); }