【问题标题】:Better algorithm generating random numbers in JS更好的算法在 JS 中生成随机数
【发布时间】:2019-03-14 21:10:37
【问题描述】:

我的目标是在 JavaScript 中生成 1 到 100 之间的随机整数。

我目前正在使用这个:

const random = Math.ceil(Math.random() * 100)
console.log(random)

但我在很多地方看到了另一种解决方案,

const random = Math.floor(Math.random() * 100 + 1)
console.log(random)

产生相同的结果。

我的问题是:

为什么第二个代码比我的第一个代码更好(如果有的话)?
执行一项操作而不是执行两项操作不是更好吗(Math.floor()+1)?

感谢您的时间和回答!

【问题讨论】:

  • 第一个示例生成 0(含)和 100(含)之间的数字,第二个示例生成 1(含)和 100(含)之间的数字。它们不一样。

标签: javascript random


【解决方案1】:

这两者之间有一个显着的区别

Math.ceil(Math.random() * 100)
Math.floor(Math.random() * 100 + 1)

第一个理论上有可能以非常小的概率产生 0,第二个没有。

【讨论】:

    【解决方案2】:

    两者产生几乎相同的结果。你可以做一个定量测试,看看抽到的数字。

    const
        getRandomCeil = () => Math.ceil(Math.random() * 100),       // 0 ... 100 0 is less likely
        getRandomFloor = () => Math.floor(Math.random() * 100 + 1); // 1 ... 100
    
    var i,
        count = { ceil: {}, floor: {} };
    
    for (i = 0; i < 1e7; i++) {
        value = getRandomCeil();
        count.ceil[value] = (count.ceil[value] || 0) + 1;
        value = getRandomFloor();
        count.floor[value] = (count.floor[value] || 0) + 1;
    }
    console.log(count);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 你修改了 OP 的公式。
    • 如果Math.random 返回 0 怎么办?
    • 我做了,但可以忽略不计。
    • @JonasWilms,对。但它的概率如何?
    • @nina 我猜大概是 1 到 2**63(64 位浮点数,假设为负指数符号)
    【解决方案3】:

    Math.random[0, 1) 范围内生成数字,这意味着 0 包括在内 而 1 不包括在内。看两个极端情况:

    // When Math.random() returns 0
    Math.ceil(0 * 100)         // returns 0 since ceiling of 0 is 0
    Math.floor(0 * 100 + 1)    // returns 1
    
    // When Math.random() returns 0.999999...
    Math.ceil(0.999999 * 100)  // returns 100
    Math.floor(0.999999 + 1)   // returns 100
    

    ceil 变体有可能在随机函数返回 0 时返回 0; although the probability is very, very little.

    【讨论】:

      猜你喜欢
      • 2013-03-26
      • 1970-01-01
      • 2010-09-24
      • 2010-12-27
      • 2010-09-05
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多