生成按顺序排序的随机数,无需重复Javascript?

时间:2017-08-16 11:15:41

标签: javascript arrays random

我正在创建一个彩票号码生成器,我无法随机生成6个号码,没有重复。这是迄今为止生成6个数字并将它们添加到randomNumbers数组并对它们进行排序的代码:

var randomNumbers = [];  
var number; 

function addNumsToArray() {  
    for(var i = 1; i <= 6; i++) {  
        number = Math.floor(Math.random() * 59 + 1);  
        randomNumbers.push(number);  
    }  
}  

function sortArray() {  
    randomNumbers.sort(function(a, b){return a - b});  
    console.log(randomNumbers);  
}  

addNumsToArray();  
sortArray(); 

3 个答案:

答案 0 :(得分:0)

使用Array#includes()函数检查。如果没有,则使用数组推送。我已更改为while,迭代次数最多为6

&#13;
&#13;
var randomNumbers = [];
var number;

function addNumsToArray() {
  var i = 0;
  while (true) {
    number = Math.floor(Math.random() * 59 + 1);
    if (!randomNumbers.includes(number)) {
      randomNumbers.push(number);
    }
    i++;
    if (i== 6) {
      break;
    }
  }
}

function sortArray() {
  randomNumbers.sort(function(a, b) {
    return a - b
  });
  console.log(randomNumbers);
}

addNumsToArray();
sortArray();
&#13;
&#13;
&#13;

答案 1 :(得分:0)

试试这个:

var randomNumbers = [];  

function addNumsToArray() {  
    for(var i = 1; i <= 6; i++) {  
        number = Math.floor(Math.random() * 59 + 1);
        randomNumbers.push(generateUniqNumber());  
    }  
}  

function sortArray() {  
    randomNumbers.sort(function(a, b){return a - b});  
    console.log(randomNumbers);  
}  

function generateUniqNumber() {
    var number = Math.floor(Math.random() * 59 + 1);

    if (randomNumbers.includes(number)) {
        return generateUniqNumber();
    }

    return number;
}
addNumsToArray();  
sortArray(); 

答案 2 :(得分:0)

基本上有两种方法

第一

  • 生成随机数(来自您的设置)
  • 检查结果是否已包含此编号
  • 如果没有,请添加此号码
  • 重复,直到你有足够的数字
function numericAscending(a,b){ return a-b; }

function lotteryNumbers(){
  var numbers = [];
  while(numbers.length < 6){
    var nr = Math.floor(Math.random() * 59 + 1);
    if(!numbers.includes(nr))
      numbers.push(nr);
  }
  return numbers.sort(numericAscending);
}

如果你想要一个大集合中只有少数数字,这种方法很好,因为碰撞在这里很少见。

第二,既然你有一组非常小的数字,你可以

  • 创建一个包含所有可能数字的数组
  • 随机播放此数组
  • 并尽可能多地使用
function shuffle(array){
  for(var i=array.length; i--; ){
    var j = Math.floor(Math.random() * (i+1));
    if(i === j) continue;
    var tmp = array[j];
    array[j] = array[i];
    array[i] = tmp;
  }
  return array;
}

function lotteryNumbers(){
  var allPossibleLotteryNumbers = [];
  for(var i=1; i<=60;++i)
    allPossibleLotteryNumbers.push(i);

  return shuffle(allPossibleLotteryNumbers).slice(0, 6).sort(numericAscending);
}

当你想要集合中的大多数数字时,建议使用这种方法,因为到最后第一种方法将创建已经存在于结果中的大量随机数。或者在这里,如果你的数字组很小,你就不必关心将所有数字存储在一个数组中。

由于你的设置在这里没有变化,你可以将数字数组存储在函数之外

var allPossibleLotteryNumbers = [];
for(var i=1; i<=60;++i)
  allPossibleLotteryNumbers.push(i);

function lotteryNumbers(){
  return shuffle(allPossibleLotteryNumbers).slice(0, 6).sort(numericAscending);
}