【问题标题】:trouble with Math.random() [duplicate]Math.random()的麻烦[重复]
【发布时间】:2015-11-03 16:39:26
【问题描述】:

有没有可能:

Math.floor(Math.random()*6+1);

能出来7个吗?更具体地说,可以:

Math.random()

以 1 的形式出现?

【问题讨论】:

  • 文档说不。 “...返回 [0, 1) 范围内的浮点伪随机数,即从 0(包括)到但不包括 1(不包括)”developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 由于浮点值的精度有限,存在边缘情况。如果Math.random() 返回0.9999999999999999,则0.9999999999999999 * 8 + 1 给出9(但0.9999999999999999 * 6 + 1 仍然给出6.999999999999999)。在您的控制台中尝试。不过,我不得不说我曾经见过这种情况发生在“野外”。
  • @FrédéricHamidi,因此使用 与双精度 64 位二进制格式 IEEE 754 值相对应的原始值进行计算会产生问题,而不是 Math.random() 本身。
  • @Nina,当然,我只是在解决问题的第一部分。我试图计算random() 返回0.9999999999999999 的几率,但现在我的头很痛,而且在我们的有生之年可能永远不会发生:)

标签: javascript


【解决方案1】:

没有,根据mozilla.org

// Returns a random number between 0 (inclusive) and 1 (exclusive)
function getRandom() {
    return Math.random();
}

或不符合标准的ECMA-262

15.8.2.14 随机( )

返回一个带正号的数值,大于或等于 0 但小于 1,随机或伪随机选择,在该范围内近似均匀分布,使用依赖于实现的算法或策略。此函数不接受任何参数。

【讨论】:

    【解决方案2】:

    Math.random() 返回一个介于 0(包括)和 1(不包括)之间的随机数

    所以不,它不能返回 1。

    使用以下公式之一获得您想要的结果:

    // Returns a random integer between min (included) and max (excluded)
    Math.floor(Math.random() * (max - min)) + min;
    //Example: get a random number >= 1 and < 7
    Math.floor(Math.random() * (7 - 1)) + 1; //Which is your example
    
    // Returns a random integer between min (included) and max (included)
    Math.floor(Math.random() * (max - min + 1)) + min;
    //Example: get a random number >= 1 and <= 7
    Math.floor(Math.random() * (7 - 1 + 1)) + 1;
    

    【讨论】:

      【解决方案3】:

      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random

      Math.random() 函数返回一个在 [0, 1) 范围内的浮点伪随机数,即从 0(包括)到但不包括 1(不包括),然后您可以缩放到您想要的范围。实现选择随机数生成算法的初始种子;用户不能选择或重置它。

      【讨论】:

        猜你喜欢
        • 2023-03-09
        • 2017-01-11
        • 1970-01-01
        • 2012-09-13
        • 2013-06-15
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 2016-05-11
        相关资源
        最近更新 更多