Dar*_*ger 5 javascript arrays random variables
我对数组如何与函数一起工作感到困惑Math.random().由于Math.random()函数选择的数字大于或等于0且小于1,因此为数组中的每个变量分配了哪个特定的数字?例如,在下面的代码中,必须选择哪个数字才能打印出来1?打印出来需要选择哪个数字jaguar?
var examples= [1, 2, 3, 56, "foxy", 9999, "jaguar", 5.4, "caveman"];
var example= examples[Math.round(Math.random() * (examples.length-1))];
console.log(example);
Run Code Online (Sandbox Code Playgroud)
是否为数组中的每个元素分配了一个等于的位置编号x/n(x是相对于第一个元素的位置编号,是元素n的数量)?由于examples有9个元素,将1处于位置1/9并将9999处于位置6/9?
Math.round() 与 Math.floor()首先要注意的Math.round()是:当你处理返回的值时,永远不会使用正确的函数Math.random().它应该是Math.floor(),然后你不需要-1修正length.这是因为Math.random()返回的值是>= 0和< 1.
这有点棘手,让我们举一个具体的例子:一个包含三个元素的数组.作为vihan1086的出色答卷解释说,这个数组的元素编号0,1和2.要从此数组中选择一个随机元素,您希望获得这三个值中的任何一个的平等机会.
让我们看看它是如何运作的Math.round( Math.random() * array.length - 1 ).数组长度是3,所以我们将乘以Math.random()通过2.现在我们有一个值,n即>= 0和< 2.我们将该数字舍入到最接近的整数:
如果n是>= 0和< .5,它会转向0.
如果n是>= .5和< 1.5,它会转向1.
如果n是>= 1.5和< 2,它会转向2.
到现在为止还挺好.我们有得到任何我们所需要的三个值,0,1,或2.但是,什么的一个机会,是机会?
仔细观察这些范围.中间范围(.5最多1.5)是其他两个范围(最多和最多)的两倍.我们有25%的机会获得,50%的机会获得,25%的机会获得三个指数值中的任何一个.哎呀.0.51.52012
相反,我们需要将Math.random()结果乘以整个数组长度3,因此n是>= 0和< 3,然后将结果乘以:Math.floor( Math.random() * array.length )它的工作原理如下:
如果n是>= 0和< 1,其楼层0.
如果n是>= 1和< 2,其楼层1.
如果n是>= 2和< 3,其楼层2.
现在很明显,我们击中任何三个值中的一个平等的机会0,1或者2,因为每个这些范围是相同的长度.
这是一个建议:不要在一个表达式中写下所有这些代码.将其分解为简单的功能,这些功能不言自明且有意义.这是我喜欢做这个特定任务的方式(从数组中选择一个随机元素):
// Return a random integer in the range 0 through n - 1
function randomInt( n ) {
return Math.floor( Math.random() * n );
}
// Return a random element from an array
function randomElement( array ) {
return array[ randomInt(array.length) ];
}
Run Code Online (Sandbox Code Playgroud)
然后其余的代码很简单:
var examples = [ 1, 2, 3, 56, "foxy", 9999, "jaguar", 5.4, "caveman" ];
var example = randomElement( examples );
console.log( example );
Run Code Online (Sandbox Code Playgroud)
看看这种方式有多简单?现在,每次想要从数组中获取随机元素时,您都不必进行数学计算,只需调用即可randomElement(array).
它们有点发生,所以我会把它分解:
你的第一部分是正确的.Math.random将生成一个数字> = 0并且<1. Math.random可以返回0但是几乎为0的机会我觉得它就像10^{-16}(你被闪电击中的可能性高出100亿倍).这将使数字如下:
0.6687583869788796
Run Code Online (Sandbox Code Playgroud)
让我们停在那里一秒钟
数组中的每个项都有一个索引或位置.范围从0 - 无穷大.在JavaScript中,数组从零开始,而不是一个.这是一张图表:
[ 'foo', 'bar', 'baz' ]
Run Code Online (Sandbox Code Playgroud)
现在索引如下:
name | index
-----|------
foo | 0
bar | 1
baz | 2
Run Code Online (Sandbox Code Playgroud)
要从索引中获取项目,请使用[]:
fooBarBazArray[0]; // foo
fooBarBazArray[2]; // baz
Run Code Online (Sandbox Code Playgroud)
现在数组长度不会与最大索引相同.这将是我们计算它的长度.所以上面的数组将返回3.每个数组都有一个length包含它的长度的属性:
['foo', 'bar', 'baz'].length; // Is 3
Run Code Online (Sandbox Code Playgroud)
现在让我们来看看这个随机化的事情:
Math.round(Math.random() * (mathematics.length-1))
Run Code Online (Sandbox Code Playgroud)
他们经历了很多事情.让我们分解一下:
所以首先我们生成一个随机数.
随机的目标是生成随机数组索引.我们需要从长度中减去1以获得最高指数.
现在给出了一个从0到最大数组索引的数字.在我之前展示的示例数组上:
Math.random() * (['foo', 'bar', 'baz'].length - 1)
Run Code Online (Sandbox Code Playgroud)
现在他们有点问题:
此代码生成一个介于0和长度之间的随机数.这意味着不-1应该在那里.我们来修复这段代码:
Math.random() * ['foo', 'bar', 'baz'].length
Run Code Online (Sandbox Code Playgroud)
运行此代码,我得到:
2.1972009977325797
1.0244733088184148
0.1671080442611128
2.0442249791231006
1.8239217158406973
Run Code Online (Sandbox Code Playgroud)
为了得到随机索引,我们必须从一个丑小数到一个很好的整数:Math.floor将基本截断小数.
Math.floor结果:
2
0
2
1
2
Run Code Online (Sandbox Code Playgroud)
我们可以将此代码放在[]随机索引中选择数组中的项目.