如何在javascript中随机生成数字而不重复?

时间:2013-03-23 09:31:26

标签: javascript arrays random for-loop

我想使用javascript随机生成0到4之间的每个数字,每个数字只能出现一次。所以我写了代码:

for(var l=0; l<5; l++) {
    var randomNumber = Math.floor(Math.random()*5);  
    alert(randomNumber)
}

但是这段代码重复了这些值。请帮忙。

12 个答案:

答案 0 :(得分:14)

生成一系列数字:

var numbers = [1, 2, 3, 4];

然后shuffle

function shuffle(o) {
    for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
    return o;
};

var random = shuffle(numbers);

答案 1 :(得分:7)

另一种方法:

for (var a = [0, 1, 2, 3, 4], i = a.length; i--; ) {
    var random = a.splice(Math.floor(Math.random() * (i + 1)), 1)[0];
    console.log(random);
}

不知道是否可以使它更紧凑。

测试:http://jsfiddle.net/2m3mS/1/

这是嵌入演示:

$('button').click(function() {
    $('.output').empty();
    
    for (var a = [0, 1, 2, 3, 4], i = a.length; i--; ) {
        var random = a.splice(Math.floor(Math.random() * (i + 1)), 1)[0];
        $('.output').append('<span>' + random + '</span>');
    }
    
}).click();
.output span {
    display: inline-block;
    background: #DDD;
    padding: 5px;
    margin: 5px;
    width: 20px;
    height: 20px;
    text-align: center;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="output"></div>
<button>Run</button>

答案 2 :(得分:5)

Adil和Minko给出的答案存在一个主要问题(尽管Minko至少将其限制在一小组数字中):他们一遍又一遍地重复相同的数字。

从这个意义上说,一个更好的方法是创建包含可能值的数组,对其进行随机播放,然后只是弹出元素。这将需要改组阵列的复杂性,但它将摆脱上面提到的问题。

var elements = [1, 2, 3, 4];
elements.shuffle(); // not a standard Javascript function, needs to be implemented

while( elements.length > 0 ) {
    console.log( elements.pop() );
}

答案 3 :(得分:2)

感谢您的所有帮助。但是,在给定的最大范围内生成随机数的另一种方法可能如下所示。

function generateRan(){
    var max = 20;
    var random = [];
    for(var i = 0;i<max ; i++){
        var temp = Math.floor(Math.random()*max);
        if(random.indexOf(temp) == -1){
            random.push(temp);
        }
        else
         i--;
    }
    console.log(random)
}

generateRan();

答案 4 :(得分:1)

如果随机数范围不是很大,您可以使用:

var exists = [],
    randomNumber,
    max = 5;
for(var l = 0; l < max; l++) {
   do {
       randomNumber = Math.floor(Math.random() * max);  
   } while (exists[randomNumber]);
   exists[randomNumber] = true;
   alert(randomNumber)
}

<强> DEMO

答案 5 :(得分:1)

生成没有任何范围的随机数

function getuid() {
        function s4() {
            return Math.floor((1 + Math.random()) * 0x10000)

        }
          return s4() + s4();
 }
 var uid = getuid();
 alert(uid)

答案 6 :(得分:1)

function getRanArr(lngth) {
  let arr = [];
  do {
      let ran = Math.floor(Math.random() * lngth); 
      arr = arr.indexOf(ran) > -1 ? arr : arr.concat(ran);
   }while (arr.length < lngth)
   
   return arr;
}

const res = getRanArr(5);

console.log(res);

答案 7 :(得分:0)

var randomNumber = [];

for (var i = 0; i < 16; i++) {
    var number = Math.floor(Math.random() * 4);
    var genNumber = randomNumber.indexOf(number);
    if (genNumber === -1) {
        randomNumber.push(number);
    }
}

答案 8 :(得分:0)

randojs.com使它成为简单的单行代码:

randoSequence(4)

这将以随机顺序返回一个从0到4的数字数组。您只需要在html文档的开头添加以下内容,就可以轻松随机地完成几乎所有您想做的事情。数组中的随机值,随机jquery元素,对象中的随机属性,甚至可以防止重复,如我在此处所示。

<script src="https://randojs.com/1.0.0.js"></script>

答案 9 :(得分:0)

类型脚本中的递归方法我在Angular应用中使用了此方法,它在JS中类似

 private randomNumbers:Array<number> = []
 private auxRandomColor:number
       public avoidRepeatNumber():void{       

        let numberRandom:number =  this.getRandomInt(0,9)
        //sistema considera o zero como undefined, logo 0 zero é 100 depois converte pra zero
        if(numberRandom === 0){
            numberRandom = 100
        }
        let existNumber = this.randomNumbers.find( number => number === numberRandom)
        if(!existNumber){

            this.randomNumbers.push(numberRandom)
            if(numberRandom === 100){
                numberRandom = 0;
            } 
            this.auxRandomColor =  numberRandom   
            return  
        }
        this.avoidRepeatNumber()   
    }


    public getRandomInt(min, max) {
            min = Math.ceil(min);
            max = Math.floor(max);
            return Math.floor(Math.random() * (max - min + 1)) + min;
        }

答案 10 :(得分:0)

HTML

<p id="array_number" style="font-size: 25px; text-align: center;"></p>

JS

var min = 1;
var max = 90;
var stop = 6;  //Number of numbers to extract

var numbers = [];

for (let i = 0; i < stop; i++) {
  var n =  Math.floor(Math.random() * max) + min;
  var check = numbers.includes(n);

if(check === false) {
  numbers.push(n);
} else {
  while(check === true){
    n = Math.floor(Math.random() * max) + min;
    check = numbers.includes(n);
      if(check === false){
        numbers.push(n);
      }
    }
  }
}

sort();

 //Sort the array in ascending order
 function sort() {
   numbers.sort(function(a, b){return a-b});
  document.getElementById("array_number").innerHTML = numbers.join(" - ");
}

DEMO

答案 11 :(得分:0)

有很多解决方案! 这是我的可重用函数的代码,其中包含3个参数:数组中所需的整数数量(长度)和数组应包含的范围(最大和最小)。

function generateRandomArr(length, max, min) {
  const resultsArr = [];
  for (let i = 0; i < length; i++) {
    const newNumber = Math.floor(Math.random() * (max - min)) + min;
    resultsArr.includes(newNumber) ? length += 1 : resultsArr.push(newNumber);
  }
  return resultsArr;
}

generateRandomArr(10, 100, 0);
// this would give a list of 10 items ranging from 0 to 100
// for example [3, 21, 56, 12, 74, 23, 2, 89, 100, 4]