Math.round(Math.random())组合似乎在我的JavaScript程序中生成了太多0

时间:2019-01-10 10:23:00

标签: javascript math

我正在尝试制作一个非常简单的脚本来生成一个2d数组,其中每个第n个数组都不包含它自己的索引作为元素,但是包含随机数量的其他随机索引值作为它们的元素,并且不能为空。以下是我为尝试实现此目的而编写的一些代码:

totElList = []
numEls = 1000

for (i=0;i<numEls;i++) {
    totElList[i] = []
    for (j=0;j<numEls;j++) {
        totElList[i][j] = j
    }
}

for (i in totElList) {
    totsplice = Math.round(Math.random()*(numEls-1))
    totElList[i].splice(i,1)
    for (j=0;j<totsplice;j++) {
        rand = Math.round(Math.random()*totElList[i].length)
        while (typeof(totElList[i][rand]) === undefined) {rand = Math.round(Math.random()*totElList[i].length)}
        totElList[i].splice(rand,1)
    }
}

问题是当我运行此命令时,totElList数组似乎包含比其他任何数字都多的0,即使我假设元素会被随机删除。我做了测试以确认这一点。对于给定的numEls,0的数量始终是所有可能值中的最大值。我猜想这与Math.random()和Math.round()的工作有关,但我不确定。有人可以给我一些见识吗?谢谢。

1 个答案:

答案 0 :(得分:2)

取而代之的是Math.round,而不是Math.floor,因为它是基于零的。

  

对于一个长度为2的数组,以一位数字和2的因子作为索引的示例。

     

如您所见,下半部分索引将移动到每个数字的下一个索引,这将导致索引错误,并且随机值最大,您会得到超出所需长度的索引。

value  round  floor  comment for round
-----  -----  -----  -----------------
 0.0     0      0
 0.1     0      0
 0.2     0      0
 0.3     0      0
 0.4     0      0
 0.5     1      0    wrong index
 0.6     1      0    wrong index
 0.7     1      0    wrong index
 0.8     1      0    wrong index
 0.9     1      0    wrong index
 1.0     1      1
 1.1     1      1
 1.2     1      1
 1.3     1      1
 1.4     1      1
 1.5     2      1    wrong index
 1.6     2      1    wrong index
 1.7     2      1    wrong index
 1.8     2      1    wrong index
 1.9     2      1    wrong index