如何在JavaScript中随机生成不重复的数字?

11
我想使用Javascript随机生成0到4之间的每个数字,并且每个数字只能出现一次。我编写了以下代码:
for(var l=0; l<5; l++) {
    var randomNumber = Math.floor(Math.random()*5);  
    alert(randomNumber)
}

但是这段代码在重复显示数值。请帮忙解决。

1
请勿重复:https://dev59.com/t3DXa4cB1Zd3GeqP7wgB#15584880 - apelsinapa
12个回答

20

生成一系列数字:

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

然后进行洗牌

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 为了一个更稳定的方法。 - Ingo Bürk

8

另一种方法:

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]。 - Matt Sergej Rinc

6
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

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

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

3

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


1

生成没有范围限制的随机数

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

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

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

演示


1

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

演示


0

使用randojs可以实现简单且具有加密安全性的编程:

console.log(randoSequence(4))
<script src="https://randojs.com/2.0.0.js"></script>


0
这里有一个解决方案,它允许您指定结果数组的长度,并且也适用于负数。

// FROM: https://dev59.com/IXE95IYBdhLWcg3wHqMV#2450976
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))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接