Javascript 用随机整数值填充数组
我买了一本JavaScript书,正在努力完成。我读到了书中没有意义的部分。我希望你们能够澄清,因为这本书没有 请参阅下面的代码,该代码生成6个随机数,并将它们呈现为带有Javascript 用随机整数值填充数组,javascript,arrays,random,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 (
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);
函数init(){
var panel=document.getElementById('panel');
变量i,rand,temp,str,num=[];
对于(i=1;i<50;i++){
num[i]=i;
}
对于(i=1;i<50;i++){
rand=Math.ceil(Math.random()*49);
temp=num[i];
num[i]=num[rand];
num[rand]=温度;
}
str='你的六个幸运数字:
';
对于(i=1;i<7;i++){
str+=num[i];
如果(i!==6){str+='-';}
}
panel.innerHTML+=str;
}
document.addEventListener('DOMContentLoaded',init,false);
书中说,第二个循环(初始化随机变量)包含一个排序算法,确保没有两个元素包含相同的数字
我不确定这是怎么可能的,我没有看到任何代码在那里停止rand
包含重复的数字,并因此将该值存储在num
中。这本书并没有对正在发生的事情提供太多的解释
有人能告诉我,如果有,循环2是如何阻止'num'包含相同的数字的吗
谢谢大家
请注意,如果此问题不符合堆栈溢出准则,则表示抱歉。我不常来这里,只有当我真的陷入困境,在别处找不到答案时才来。这个循环创建了一个从1到49的排序数组:
for (i = 1; i < 50; i ++){
num[i] = i;
}
此循环创建从1到49的排序数组:
for (i = 1; i < 50; i ++){
num[i] = i;
}
该循环使用从1到50的50个整数填充和数组
然后它就把它们混在一起了。rand变量用于指向数组中的随机索引。此循环使用从1到50的50个整数填充数组
for (i = 1; i < 50; i ++){
rand = Math.ceil(Math.random()*49);
temp = num[i];
num[i] = num[rand];
num[rand] = temp;
}
然后它就把它们混在一起了。rand变量用于指向数组中的随机索引。第一个for循环只是创建一个包含49个元素的数组,每个数组元素等于其索引:
for (i = 1; i < 50; i ++){
rand = Math.ceil(Math.random()*49);
temp = num[i];
num[i] = num[rand];
num[rand] = temp;
}
num[1] = 1
num[2] = 2
etc.
第二个for循环是您问题的焦点,它随机洗牌这个有序数组
例如:
for循环的第一次迭代,rand得到的值是23,循环中的逻辑然后将num[23]中的值与num[1]中的值进行SWOT,从而得出:
num[1] being equal to 23 (because num[23] was equal to 23 as per above)
num[23] being equal to 1
num[2] being equal to 18 (because num[18] was equal to 18 as per above)
num[18] being equal to 2
for循环的第二次迭代,rand得到18的值,然后循环中的逻辑将num[18]中的值与num[2]中的值进行SWOT,从而得出:
num[1] being equal to 23 (because num[23] was equal to 23 as per above)
num[23] being equal to 1
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;博士有序数组被洗牌。第一个for循环只是创建一个由49个元素组成的数组,每个数组元素等于其索引:
num[1] = 1
num[2] = 2
etc.
第二个for循环是您问题的焦点,它随机洗牌这个有序数组
例如:
for循环的第一次迭代,rand得到的值是23,循环中的逻辑然后将num[23]中的值与num[1]中的值进行SWOT,从而得出:
num[1] being equal to 23 (because num[23] was equal to 23 as per above)
num[23] being equal to 1
num[2] being equal to 18 (because num[18] was equal to 18 as per above)
num[18] being equal to 2
for循环的第二次迭代,rand得到18的值,然后循环中的逻辑将num[18]中的值与num[2]中的值进行SWOT,从而得出:
num[1] being equal to 23 (because num[23] was equal to 23 as per above)
num[23] being equal to 1
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;博士有序数组被洗牌。您可以将这两个循环想象为:第一个循环生成一副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;
}
(i=1;i<50;i++)的{
rand=i+Math.floor(Math.random()*(50-i));
temp=num[i];
num[i]=num[rand];
num[rand]=温度;
}
其思想是交换循环中的当前元素,仅交换后续元素(包括其本身)。请注意,如果您将上面的循环写为向后运行(即从49到1),它会使它稍微简单一些,我更喜欢这种方法。您可以将两个循环想象为如下所示:第一个循环生成一组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;
}
(i=1;i<50;i++)的{
rand=i+Math.floor(Math.random()*(50-i));
temp=num[i];
num[i]=num[rand];
num[rand]=温度;
}
其思想是交换循环中的当前元素,仅交换后续元素(包括其本身)。请注意,如果您将上面的循环写为向后运行(即从49到1),它会使它稍微简单一些,我更喜欢这种方法。我不会说第二个问题有那么严重 — 至少在这种情况下不是这样。这是“幸运数字”,不是火箭科学。好吧,正确的算法并不重要