【问题标题】:How to make random number generator not generate the same number twice如何使随机数生成器不会两次生成相同的数字
【发布时间】:2014-01-26 23:21:16
【问题描述】:

我对编程还很陌生,我一直在做一个项目,该项目可以找到四个随机 div 并向它们添加一个类——我唯一的问题是,因为我的随机生成器经常生成相同的数字,所以程序通常不会将类附加到四个随机 div,但很可能是三个甚至两个。所以我的问题是,如果可能的话,我如何将我的程序设置为只生成四个不同的数字。 我听说过 Fisher Yates 的尝试,但我没有完全理解。 这是我的 JS:

for(var i = 4; i>0; i--){
var rand = Math.floor((Math.random()*16)+1);
var array=new Array(); 
array[1] = "one";
array[2] = "two";
array[3] = "three";
array[4] = "four";
array[5] = "five";
array[6] = "six";
array[7] = "seven";
array[8] = "eight";
array[9] = "nine";
array[10] = "ten";
array[11] = "eleven";
array[12] = "twelve";
array[13] = "thirteen";
array[14] = "fourteen";
array[15] = "fifteen";
array[16] = "sixteen";
$('#'+array[rand]).addClass('bomb');
}

非常感谢任何帮助!

【问题讨论】:

  • 1. stackoverflow.com/a/6274398/251311 2. 以0 开始索引,而不是1
  • Fisher Yates shuffle 遇到了什么问题?你看过这里stackoverflow.com/questions/2450954/…。你需要打乱数组,然后抓取四个元素。
  • 只需列出所有内容,将列表随机排列,然后取出前四个。如果您不想编写自己的方法,请搜索 [].shuffle 方法,但要查找基于 sort() 的方法;他们实际上并没有随机化......

标签: javascript random numbers


【解决方案1】:

几个 cmets:首先,您应该在 for 循环之外初始化您的数组,以便它只执行一次。此外,正如@zerkms 指出的那样,您应该从索引 0 而不是 1 开始您的数组。为了防止重复数字,您可以简单地从数组中删除您已经选择的那些。以下是您如何执行此操作的示例:

var array=new Array(); 
array[0] = "one";
array[1] = "two";
array[2] = "three";
array[3] = "four";
array[4] = "five";
array[5] = "six";
array[6] = "seven";
array[7] = "eight";
array[8] = "nine";
array[9] = "ten";
array[10] = "eleven";
array[11] = "twelve";
array[12] = "thirteen";
array[13] = "fourteen";
array[14] = "fifteen";
array[15] = "sixteen";
for(var i = 4; i>0; i--){
    var rand = Math.floor((Math.random()*array.length));
    $('#'+array[rand]).addClass('bomb');
    array.splice(rand,1);
}

希望这会有所帮助!

编辑:我已经删除了导致错误的不必要的 while 循环。

【讨论】:

  • 谢谢@Jlennon321,但是——你的回答似乎让 JSFiddle 崩溃了!也许我错过了什么?
  • 我的错!我的代码有错误。我已经对其进行了编辑,现在应该可以使用了。
  • 感谢您的帮助! @Jlennon321
【解决方案2】:

这是您的主题问题的示例(从 1 到 13)

for (var i = 0, ar = []; i < 14; i++) { ar[i] = i; }
console.log( ar.sort(function () { return Math.random() - 0.5; }) );

输出:

[1, 2, 0, 3, 5, 6, 13, 4, 8, 9, 12, 10, 7, 11] ->> run first time
[3, 7, 4, 10, 1, 9, 11, 8, 13, 12, 2, 5, 0, 6] ->> runt second time
etc..

【讨论】:

    【解决方案3】:

    这可以通过先洗牌来完成,如an earlier answer 中所述。

    kfy(array);
    for (var i = 0; i < 4; ++i) {
        $('#' + array[i]).addClass('bomb');
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      相关资源
      最近更新 更多