使用随机整数值填充数组

时间:2016-09-24 22:51:23

标签: javascript arrays random

我买了一本JavaScript书,正在努力。我已经达到了本书的一部分没有意义。我希望你和男孩能够澄清这本书没有。

请参阅下面的代码,该代码会生成6个随机数,并将它们呈现给id=panel的div。

function init(){
var panel = document.getElementById('panel');
var i, rand, temp, str, num = [];

for (i = 1; i < 50; i ++){
    num[i] = i;
}

for (i = 1; i < 50; i ++){
    rand = Math.ceil(Math.random()*49);
    temp = num[i];
    num[i] = num[rand];
    num[rand] = temp;
}

str = 'Your six lucky numbers:<br>';
for (i = 1; i < 7; i ++){
    str += num[i];
    if (i !==6){str += ' - ';}
}
panel.innerHTML += str;

}
document.addEventListener('DOMContentLoaded', init, false);

本书说第二个循环(启动随机变量)包含一个排序算法,确保没有两个元素包含相同的数字。

我不确定这是怎么可能的,我没有看到任何代码阻止rand包含重复的数字并因此将该值存储在num中。这本书并没有真正解释发生了什么。

有人可以告诉我,如果有的话,循环2是否阻止&#39;数字包含相同的数字?

全部谢谢

P.S。很抱歉,如果此问题不符合Stack Overflow指南。我不经常来这里,只有当我真的陷入困境并且无法在其他地方找到答案时。

4 个答案:

答案 0 :(得分:2)

您可以将两个循环视为如下:第一个循环生成一组49“卡”(此处用数字1到49表示)。然后第二个循环通过反复交换每张卡片来随机播放那些“卡片”。

注意代码有两个问题。首先,当仅选择6个元素时,不必对整个阵列进行混洗。所以第二个循环可以在6而不是50结束。

但是代码存在一个更严重的问题,它使用错误的算法来重新排列数组元素。该算法不会以相同的概率产生所有可能的元素排列。

这是正确的版本:

for (i = 1; i < 50; i ++){
    rand = i + Math.floor(Math.random()*(50 - i));
    temp = num[i];
    num[i] = num[rand];
    num[rand] = temp;
}

想法是在循环中交换当前元素,仅与后续元素(包括其自身)交换。请注意,如果你编写上面的循环来向后运行(即从49到1),它会使它更简单,我更喜欢这种方法。

答案 1 :(得分:1)

此循环创建一个从1到49的排序数组:

for (i = 1; i < 50; i ++){
    num[i] = i;
}

此循环重新排序数组的每个位置(i),并通过交换两个随机位置 rand。它不会生成新的随机数,只是随机重新排序现有数字。 rand索引,在这种情况下不是值。没有两个数字可以相同,因为第一个循环只在数组中放置了每个数字的一​​个实例。

for (i = 1; i < 50; i ++){
    rand = Math.ceil(Math.random()*49);
    temp = num[i];
    num[i] = num[rand];
    num[rand] = temp;
}

答案 2 :(得分:1)

这个循环用50到50的整数填充和数组。

然后它只是混合它们。 rand变量用于指向数组中的随机索引。

答案 3 :(得分:1)

第一个for循环只是创建一个包含49个元素的数组,每个数组元素都等于它的索引:

num[1] = 1
num[2] = 2
etc.

第二个for循环,这是你问题的焦点,随机洗牌这个有序数组。

作为例子:

for循环的第一次迭代,rand获得say 23 的值,循环中的逻辑然后使用num [1]中的值来交换num [23]中的值,以便您最终得到:

num[1] being equal to 23 (because num[23] was equal to 23 as per above)
num[23] being equal to 1

for循环的第二次迭代,rand得到say 18 的值,循环中的逻辑然后使用num [2]中的值来交换num [18]中的值,以便你最终得到:

num[2] being equal to 18 (because num[18] was equal to 18 as per above)
num[18] being equal to 2

这将发生49次。

这也是Math.random()乘以49的原因,只有49个数组元素具有值。

TL; DR;有序数组被洗牌。