【问题标题】:Some thoughts about generating random number关于生成随机数的一些想法
【发布时间】:2012-08-15 21:38:07
【问题描述】:

我想要一些关于生成随机整数的信息。我在 GoogleStack Overflow 中寻找它,并且大部分都找到了这样的代码(如果我们想要从 1 到 52 的数字):

var randInt=function(){
   number=Math.floor(Math.random()*52+1);
};

var randNumMin = 1;
var randNumMax = 52;
var randInt = function (){
   number = (Math.floor(Math.random() * (randNumMax - randNumMin + 1)) + randNumMin);
};

我阅读了一些关于Math.random 的参考资料,发现它正在生成从01 的数字。如果Math.random 生成1,我们将得到数字5,这意味着我们会得到错误。我同意这是非常罕见的情况,但这是可能的。我稍微修改了代码以避免该错误(在我们的例子中生成数字53)。这里我认为是在 JavaScript 中生成随机数的正确代码。在您的示例中,它仅生成整数,但我认为可以修改代码并生成任何类型的数字:

var randInt = function(){
    number = Math.floor(Math.random()*52+1);
    if (number === 53){
       randInt();
    }
};

var randNumMin = 1;
var randNumMax = 52;
var randInt = function (){
    number = (Math.floor(Math.random() * (randNumMax - randNumMin + 1)) + randNumMin);
    if (number===53){
        randInt();
    }
};

【问题讨论】:

    标签: javascript random


    【解决方案1】:

    Math.random() 函数生成随机数 x 其中0 <= x < 1。所以它永远不会精确地生成 1,尽管它可能非常接近。

    来自the documentation for random

    返回[0, 1) 范围内的浮点伪随机数,即从 0(包括)到但不包括 1(不包括),然后您可以将其缩放到所需的范围。

    【讨论】:

      【解决方案2】:

      只需获取您的第一个代码示例,然后从 52 中减去一个。一般公式如下:

      random number between X and Y = (Y - X) * Math.random() + X
      

      或者对于整数,

      Math.round((Y - X) * Math.random() + X)

      或者更准确(正如@Guffa 指出的那样),

      Math.floor((Y-(X-1)) * Math.random() + X)
      

      【讨论】:

      • 不,这会在 X 和 X+Y 之间生成一个随机数。
      • @Guffa 不,它不会。注意 (Y - 1)
      • @Guffa OP 的公式会返回那个。因此问题发布在 SO
      • 你完全没有抓住重点。该代码不会返回 X 和 Y 之间的随机数,而是返回 X 和 X+Y 之间的随机数。
      • @Guffa 确定吗?设 x = 1,y = 10,Math.random() = 1(最大值)。我让你算算。
      【解决方案3】:

      你不需要使用地板,因为它确实会减少结果。

      只需使用round

      Math.round(Math.random(51))+1

      【讨论】:

        猜你喜欢
        • 2017-09-24
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        • 1970-01-01
        • 2014-12-27
        • 1970-01-01
        • 1970-01-01
        • 2023-01-03
        相关资源
        最近更新 更多