【问题标题】:How to generate 10 unique random numbers from a set of 100 using javascript?如何使用 javascript 从一组 100 个随机数中生成 10 个唯一的随机数?
【发布时间】:2016-03-27 03:03:43
【问题描述】:

我正在开发一个扫雷 Web 应用程序,我正在尝试生成 10 个具有唯一位置 ID (1-100) 的地雷。我编写了一个函数来执行此操作,并将 10 个数字记录到一个名为 numbers 的数组中。但是每次我运行程序时,它都会产生 10 个从 1 到 100 的相同数字。有谁知道我做错了什么? (更新:当我将循环从 while 更改为 do...while 时它起作用了,但现在的问题是为什么要修复它?)

这是我的 jQuery 代码:

var chooseMines = function(num) {
  var temp,bool,numbers = [];
  for(i = 1; i <= 10; i++) {
    do
    {
        bool = 0;
        temp = Math.floor(100 * Math.random()) + 1;
        for(j = 0; j < numbers.length; j++) {
            if(numbers[j] === temp)
            {
                bool = 1;
            }
        }
    } while(bool)
    numbers.push(temp);
}
window.confirm(numbers);
return numbers;
};

这是我的旧js:

var chooseMines = function(num) {
  var temp,bool = 1,numbers = [];
  for(i = 1; i <= 10; i++) {
    while(bool)
    {
        bool = 0;
        temp = Math.floor(100 * Math.random) + 1;
        for(j = 0; j < numbers.length; j++) {
            if(numbers[j] === temp)
            {
                bool = 1;
            }
        }
    }
    numbers.push(temp);
}
window.confirm(numbers);
return numbers;
};

【问题讨论】:

  • 似乎返回包含NaN 的数组? ,还有Math.random没有被调用?
  • 为什么将bool 设置为10 而不仅仅是使用truefalse
  • 因为 1 和 0 打字比较快,而且我不擅长打字
  • Math.random 是一个函数,所以必须调用它Math.random()
  • 我刚刚在问题中解决了这个问题

标签: javascript jquery random


【解决方案1】:

对于更新后的问题,您不断得到相同数字的原因是因为您第一次运行它时将bool 设置为0。然后将temp 设置为一个随机数。这一切都很好,直到您到达内部 for 循环。因为j = 0numbers.length 等于0,并且j &lt; numbers.length 等于false,所以会发生什么情况。这意味着boolwhile 循环结束时仍设置为0。这可以防止它再次运行。但是外部的for 循环仍然运行了9 次,将temp(已经是一个设定的数字)推到numbers 数组上。另外,Math.random 上没有括号。

更新版本有效,因为每次执行 for 主循环时,代码都会至少执行一次 do..while 循环中的代码。第一次它不执行内部 for 循环,但其他 9 次 j 小于 numbers.length 所以它可以工作。

此代码也有效并阻止您需要 bool 变量:

var chooseMines = function(num) {
    var num = num || 100;
    var currentNum = 0;
    var mines = [];
    for (var i = 0; i < 10; i++) {
        do {
            currentNum = Math.ceil(Math.random() * num);
        } while(mines.includes(currentNum))
        mines.push(currentNum);
    }
    return mines;
}

您可以设置num 变量,也可以不设置。默认为 100。

【讨论】:

    【解决方案2】:

    尝试使用单个 while 循环,Array.prototype.indexOf()

      var r = function() {
      return Math.floor(Math.random() * (100 - 1) + 1)
    }
    
    function randArr(num) {
      var res = [];
      while (res.length < num) {
        var rand = r();
        if (res.indexOf(rand) == -1)
          res.push(rand)
        else res[res.indexOf(rand)] = r()
      };
      return res
    }
    
    for (var i = 0; i < 20; i++) console.log(randArr(10))

    或者,使用两个 while 循环

    var r = function() {
      return Math.floor(Math.random() * (100 - 1) + 1)
    }
    
    function randArr(num) {
      var res = [];
      while (res.length < num) {
        var rand = r();
        while (res.indexOf(rand) != -1) {
          rand = r();
        }
        res.push(rand);
      };
      return res
    }
    
    for (var i = 0; i < 20; i++) console.log(randArr(10))

    【讨论】:

    • @NullSpark “有人知道我做错了什么吗?(​​更新:当我将循环从 while 更改为 do...while 时它起作用了……但现在的问题是为什么要修复它?)" 初始 js 在 Question 没有调用 Math.random() 。也许将原始js留在问题比较?
    猜你喜欢
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2013-07-20
    • 2013-03-13
    • 2023-03-16
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多