JavaScript:如何解释`Math.floor(Math.random)`方法的变体?

时间:2015-12-17 14:03:19

标签: javascript math random integer

似乎Math.random()*3|0等同于Math.floor(Math.random() * 3),这是我熟悉的版本。虽然我理解后者如何生成整数0,1和2的逐步过程没有问题,但前者的结构让我感到困惑。它可能是更为迂回Math.floor方法的惯用变体。

是否可以用x|y样式表示以下两段代码,并产生相同的结果?如果是这样,你能否打破它的运作方式?

1 + Math.floor(Math.random() * 100) // yielding 1-100 (inclusive)

190 + Math.floor(Math.random() * 66) // yielding 190-255 (inclusive)

3 个答案:

答案 0 :(得分:2)

|是javascript中的Bitwise Or运算符。 Bitwise Or运算符在每个位位置返回一个位,其中一个或两个操作数的相应位为1。 x | 0是x,对于任何x

bitwise运算符仅适用于整数,因此javascript将float转换为整数。 因此1.5 | 0变为1.

您的表达式可以重写为

1 + (Math.random() * 100 | 0)

190 + (Math.random() * 66 | 0)

答案 1 :(得分:0)

|是一个按位OR运算符。它在每个位的位置返回一个,其中一个或两个操作数的相应位是1。

您可以轻松地将方法更改为以下内容:

1 + Math.random()*100|0

190 + Math.random()*66|0

答案 2 :(得分:0)

根据EMCAScript规范,似乎当逐位运算符应用于数字时,它将转换为Int32值。这可以解释这种行为。 链接:http://www.ecma-international.org/ecma-262/5.1/#sec-11.10

“生产A:A @ B,其中@是上述产品中的一个按位运算符,评估如下:

让lref成为评估A的结果。 设lval为GetValue(lref)。 让rref成为评估B的结果。 设rval为GetValue(rref)。 让lnum成为ToInt32(lval)。 让rnum为ToInt32(rval)。 返回将按位运算符@应用于lnum和rnum的结果。结果是带符号的32位整数。 “