我正在尝试制作一个非常简单的脚本来生成一个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()的工作有关,但我不确定。有人可以给我一些见识吗?谢谢。
答案 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