【问题标题】:JavaScript: How to interpret a variation of the `Math.floor(Math.random)` method?JavaScript:如何解释 `Math.floor(Math.random)` 方法的变体?
【发布时间】:2016-03-24 00:48:17
【问题描述】:

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

是否可以用x|y 风格来表达以下两个sn-ps 代码并产生相同的结果?如果是这样,你能分解一下它是如何工作的吗?


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

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

【问题讨论】:

  • num | 0Math.floor(num)基本相同

标签: javascript math random integer


【解决方案1】:

|是按位或运算符。它在每个操作数的对应位为 1 的每个位位置返回一个 1。

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

1 + Math.random()*100|0

190 + Math.random()*66|0

【讨论】:

    【解决方案2】:

    根据 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 位整数。 "

    【讨论】:

      【解决方案3】:

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

      位运算符仅适用于整数,因此 javascript 将浮点数转换为整数。 因此 1.5 | 0 变成 1。

      你的表达式可以改写为

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-08
        • 2022-09-28
        • 2016-03-15
        • 2019-05-03
        • 2018-04-02
        • 2014-05-07
        相关资源
        最近更新 更多