我买了一本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指南。我不经常来这里,只有当我真的陷入困境并且无法在其他地方找到答案时。
答案 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;有序数组被洗牌。