【问题标题】:Influence Math.random()影响 Math.random()
【发布时间】:2011-05-04 16:33:45
【问题描述】:

我正在寻找影响 Math.random() 的方法。

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

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

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

例如; rand(0, 10) 会返回更多的 0,1,9,10。

【问题讨论】:

    标签: javascript algorithm math random


    【解决方案1】:

    一个基本结果是,如果 U 是具有均匀分布的随机变量,F 是您要从中采样的累积分布,则 Y = G(X) 其中 G 是 F 的倒数,则 F 作为其累积分布。这可能不一定是从各种分布中生成和生成随机数的最有效方式,这本身就是一个研究子领域。但对于一个简单的转换,它可能只是解决问题。就像您的情况一样,F(x) 可能是 4*(x-.5)^3+.5,它似乎满足所有约束并且易于反转并用作基本随机数生成器的转换。

    【讨论】:

      【解决方案2】:

      当然。不完全清楚您是否想要平滑滚降,因此(例如)2 和 8 比 5 或 6 更频繁地返回,但总体思路无论哪种方式都适用。

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

      将这些加起来,我们需要生成器中的值从 1 到 29(或 0 到 28,或其他)。前 5 个中的任何一个输出为 0。接下来的 4 个中的任何一个输出为 1。接下来的 3 个中的任何一个输出为 2,依此类推。

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

      【讨论】:

        【解决方案3】:

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

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

        var dd = rand(1,5) + rand(0,5);
        var result;
        if (dd > 5)
            result = dd - 5;
        else result = 6 - dd;
        

        【讨论】:

          【解决方案4】:

          你能影响 Math.random 在 javascript 中的输出(运行客户端)吗?

          没有。至少不是以任何可行/实用的方式。

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

          【讨论】:

            【解决方案5】:

            您需要一张分布图。从随机输出 [0,1] 映射到您想要的分布结果。如 [0,.3] 将产生 0,[.3,.5] 将产生 1,依此类推。

            【讨论】:

              【解决方案6】:

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

              在这 100 个元素中,您更频繁地表示感兴趣的数字。

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

              【讨论】:

                【解决方案7】:

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

                是的。您想更改生成的数字的分布。

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

                【讨论】:

                  【解决方案8】:

                  不是真的。有一个基于种子生成的数字序列。您的随机数来自序列。当您调用 random 时,您正在抓取序列的下一个元素。

                  【讨论】:

                  • 正如其他人所描述的,您可以对该数字流应用转换以生成具有所需特征的流。
                  猜你喜欢
                  • 2015-09-24
                  • 2017-12-04
                  • 2011-07-31
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-11-21
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多