关于数组的Math.random

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

Mic*_*ary 9

Math.round()Math.floor()

首先要注意的Math.round()是:当你处理返回的值时,永远不会使用正确的函数Math.random().它应该是Math.floor(),然后你不需要-1修正length.这是因为Math.random()返回的值是>= 0< 1.

这有点棘手,让我们举一个具体的例子:一个包含三个元素的数组.作为vihan1086的出色答卷解释说,这个数组的元素编号0,12.要从此数组中选择一个随机元素,您希望获得这三个值中的任何一个的平等机会.

让我们看看它是如何运作的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).


Dow*_*oat 7

它们有点发生,所以我会把它分解:

的Math.random

你的第一部分是正确的.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)

他们经历了很多事情.让我们分解一下:

的Math.random()

所以首先我们生成一个随机数.

*mathematics.length - 1

随机的目标是生成随机数组索引.我们需要从长度中减去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)

我们可以将此代码放在[]随机索引中选择数组中的项目.

更多信息/来源