【问题标题】:How to randomly generate numbers without repetition in javascript?如何在javascript中随机生成数字而不重复?
【发布时间】:2025-11-28 10:15:01
【问题描述】:

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

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

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

【问题讨论】:

标签: javascript arrays random for-loop


【解决方案1】:

生成一个数字范围:

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 以获得更稳定的方法。
【解决方案2】:

另一种方法:

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>

【讨论】:

  • 上面脚本的第二行要改成 var random = a.splice(Math.floor(Math.random() * i), 1)[0]; splice 函数使用从零开始的索引,因此在数组长度为 5 的情况下,计算的索引也可以为 5,并且 a 数组没有 a[5]。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    感谢您的所有帮助。但可能另一种在给定最大范围内生成随机数的方法可以按照以下方式实现。

    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();
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        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

        【讨论】:

          【解决方案7】:

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

          function getuid() {
                  function s4() {
                      return Math.floor((1 + Math.random()) * 0x10000)
          
                  }
                    return s4() + s4();
           }
           var uid = getuid();
           alert(uid)
          

          【讨论】:

            【解决方案8】:

            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

            【讨论】:

              【解决方案9】:

              randojs 的简单和加密安全:

              console.log(randoSequence(4))
              &lt;script src="https://randojs.com/2.0.0.js"&gt;&lt;/script&gt;

              【讨论】:

                【解决方案10】:

                有这么多解决方案! 这是我的可重用函数的代码,它接受 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]
                

                【讨论】:

                • i -= 1 可以合理地替代 length += 1 以保持“我们想要一系列 长度 随机选择的数字”吗?
                【解决方案11】:

                这是一个解决方案,可让您指定结果数组的长度,也可以使用负数。

                // FROM: https://*.com/a/2450976/2345158
                function shuffleArr(array) {
                  let currentIndex = array.length;
                  let randomIndex;
                  // While there remain elements to shuffle...
                  while (currentIndex !== 0) {
                    // Pick a remaining element...
                    randomIndex = Math.floor(Math.random() * currentIndex);
                    currentIndex--;
                    // And swap it with the current element.
                    [array[currentIndex], array[randomIndex]] = [
                      array[randomIndex], array[currentIndex]];
                  }
                  return array;
                }
                
                // Will generate a list of random numbers in a range without duplicates
                function getRandomNumberArr(min, max, length) {
                  if (length > max - min + 1) throw Error('Length must not be longer than number of unique values.')
                  // Generate list of possible values
                  let optionsArr = [...Array(max - min + 1).keys()];
                  // Return the needed number of random elements
                  return shuffleArr(optionsArr).splice(0, length).map(el => el + min);
                }
                
                console.log(getRandomNumberArr(-2, 2, 5))

                【讨论】:

                  【解决方案12】:
                  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);
                      }
                  }
                  

                  【讨论】:

                  • 请缩进,这样它就显示为一个代码块。解释您的代码也可能使这成为一个更好的答案。
                  • 我听不懂你在说什么?