代码之家  ›  专栏  ›  技术社区  ›  Sindre Sorhus

影响数学。随机()

  •  6
  • Sindre Sorhus  · 技术社区  · 15 年前

    我有这个函数生成一个从最小到最大的数字:

    var rand = function(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }
    

    有没有办法使它比中间的数字更有可能得到一个低和高的数字?

    8 回复  |  直到 15 年前
        1
  •  13
  •   Mark Bolusmjak    15 年前

    有没有办法使它比中间的数字更有可能得到一个低和高的数字?

    对。要更改生成的数字的分布。

    http://en.wikipedia.org/wiki/Random_number_generation#Generation_from_a_probability_distribution

        2
  •  2
  •   GWW    15 年前

    一个简单的解决方案是生成一个包含100个元素的数组。

    作为一个简单的例子,假设您希望数字1和10更频繁地出现,则可以在数组中过度表示它。也就是说,数列中的第一个有20次,数列中的第十个有20次,其余的数均匀分布。然后使用0-100之间的随机数作为数组索引。与其他数字相比,这将增加你获得1或10的概率。

        3
  •  2
  •   shoebox639    15 年前

    你需要一张分布图。从随机输出[0,1]映射到所需的分布结果。就像[0,.3]会产生0,[3,.5]会产生1,依此类推。

        4
  •  1
  •   Jerry Coffin    15 年前

    典型的方法是生成比输出更大的数字范围。例如,让我们从5开始作为以频率N出现的基线。假设您希望4或7在频率2N出现,3或8在频率3N、2或9出现,频率4N出现,0或10在频率5N出现。

    当然,这并不会改变原始生成器返回的值——它只允许我们编写一个自己的生成器,根据我们选择的分布生成数字。

        5
  •  0
  •   user489041    15 年前

        6
  •  0
  •   MAK    15 年前

    你能影响 Math.random 在javascript中(哪个运行客户端)?

    但是你可以做的是创建你自己的随机数生成器,在你需要的分布中产生数字。

        7
  •  0
  •   winwaed    15 年前

    可能有无数种方法可以做到这一点,您可能需要考虑概率函数的确切形状/曲率。

    它可能在一行中完成,但这里是使用现有函数定义的多行方法(命名为 rand ,此处):

    var dd = rand(1,5) + rand(0,5);
    var result;
    if (dd > 5)
        result = dd - 5;
    else result = 6 - dd;
    
        8
  •  0
  •   piccolbo    15 年前

    一个基本的结果是,如果U是均匀分布的随机变量,F是要从中抽样的累积分布,那么Y=G(X),其中G是F的倒数,F是其累积分布。这不一定是最有效的方法,从各种分布中产生随机数本身就是一个研究子领域。但对于一个简单的转换,它可能只会起到作用。和你的例子一样,F(x)可以是4*(x-.5)^3+.5,它似乎满足了所有的约束条件,而且很容易反转并用作基本随机数生成器的转换。