Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用随机整数值填充数组_Javascript_Arrays_Random - Fatal编程技术网

Javascript 用随机整数值填充数组

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 (

我买了一本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);
函数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),它会使它稍微简单一些,我更喜欢这种方法。

我不会说第二个问题有那么严重 — 至少在这种情况下不是这样。这是“幸运数字”,不是火箭科学。好吧,正确的算法并不重要