【问题标题】:Generate 7 unique random numbers in javascript在javascript中生成7个唯一的随机数
【发布时间】:2014-06-30 10:02:37
【问题描述】:

我正在做一个项目。

我基本上是在客户端使用 javascript 重新创建乐透以生成 6 个随机数和一个奖金球。众所周知,乐透号码不可能相同。这就是我的问题所在。

是否可以将已生成的数字从循环中的下一轮可用中删除?这将使函数完全随机。还是我还需要使用 indexOf 将数字与数组中的其他数字进行比较?

例如,以下可能吗?,

生成的第一个数字是 25, 然后该功能会删除该号码,使其无法再次出现。 等等……

这是我的js代码,

    function play(){
    numbersArray = [];
    for (i=0; i<=6;){
        n = Math.floor(Math.random()*40)+1;
        a = numbersArray.indexOf(n);
        if ( a == "-1"){
            numbersArray[i] = n;
            i++;
            var ballId = "ball"+i;
            if( i != "7"){
                document.getElementById(ballId).innerHTML = '<p>'+ n +'</p>';   
            } else {
                document.getElementById("bonus").innerHTML = '<p>'+ n +'</p>';
            } 
        } //end of if
    }//end of for loop
}//end of play function

【问题讨论】:

  • 在相同长度的数组中生成所有可能出现在球上的数字。然后打乱数组并取前七个条目。可以把它想象成洗一副牌,然后拿走前 7 张牌。或者,把它想象成一个装满乐透球的玻璃罐,它会四处弹跳,然后取出从洞里掉出来的前 7 个 :)
  • 可能duplicate
  • 查看here 了解uniqueRandom() 函数。
  • @Pointy 好主意,非常感谢!

标签: javascript math random numbers


【解决方案1】:

您需要创建一个对象,在这种情况下,您可以使用一个数组来保存所有可能出现在球上的数字,我们将其命名为 n。然后,您可以使用 while 循环继续从该数组中挑选数字,并在每次迭代时从数组中拼接/删除该特定数字。

function play(n) {

  var picks = [];
  // Store possibilities in the numbersArr array
  var numbersArr = [];

  // n is the max number you can choose to appear on a ball
  for ( var i = 0; i < n; i++ ) { 
    numbersArr.push(i);
  }

  while (picks.length < 7){
     var randomIndex = Math.floor(Math.random() * numbersArr.length);
     picks.push(numbersArr[randomIndex]);
     numbersArr.splice(randomIndex, 1);
  }

  return picks;
}

【讨论】:

  • 这并不是最好的做事方式。最好用 Fisher-Yates shuffle 对数组进行洗牌,然后只取前 7 个元素。
  • 你能解释一下它是如何更好的吗?我很想知道在这种情况下,Fisher-Yates shuffle 的优势是什么。塔
猜你喜欢
  • 2013-03-13
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多