【问题标题】:creating random numbers that favor smaller numbers创建有利于较小数字的随机数
【发布时间】:2012-01-20 14:56:10
【问题描述】:

假设我生成了一组随机数并将它们放入一个数组中,(为简单起见预先排序)我将使用 javascript 来显示数学:

var vals = new Array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,...,10000);

然后在循环中,我创建了一个随机数作为索引:

for(i=0;i<10000;i++){
    var random_index = Math.floor(Math.random() * 10000);
    var result = vals[random_index];
}

如果您在任何类型的图表上查看此输出,结果(通过该循环进行足够的迭代,将看起来非常随机且平衡)

我想要的是,每次访问的结果都支持较小的数字,顺便说一下,这里是具有较低索引的数组元素。

对于一个视觉示例,假设您正试图在地图上绘制烟花碎片落下的位置。这些碎片中的大多数会随机落在附近,但向中间集中度更高。这是一个有点过于复杂的例子,因为它考虑了另一个维度并使用物理来实现结果,但原理相同。

我应该对 random_index 变量执行什么操作以使其“偏爱”较小的数字?

【问题讨论】:

标签: algorithm math random numbers calculus


【解决方案1】:

通常的方法(例如 here 解释的方法)是定义您想要的分布函数,然后使用两种方法之一将均匀分布的随机变量转换为具有所需分布的随机变量。如果你的目标分布足够简单,你可以使用inverse transform sampling

如果您并不真正关心分布函数是什么样的,只是喜欢较小的值,那么一种简单的方法可能是生成一个统一的 r.v。在 [min2, max2] 范围内,然后将其平方根作为您的 r.v.

【讨论】:

    【解决方案2】:

    您可以做很多事情。

    例如:

    Math.floor(Math.sqrt(Math.random() * 10000^2));
    

    真正的问题是,您想要什么样的分布?

    【讨论】:

    • 好问题,我认为我必须直观地查看结果以确定我正在使用的应用程序的“看起来正确”。使用该函数,我如何操纵分布?
    • 没错。立方的立方根将比平方根更偏向小数,依此类推。同样,您可以采用指数的对数,这再次为您提供不同的形状。可能性是无穷无尽的,如果你只是想要一个快速、任意的分布,并且非常有利于小数字,那么它们都很好。但如果您需要更具体的内容,那么您应该考虑@Ted Hopp 的回答。
    • 这是一个错误的答案。 Sqrt(R * Max^2) = Sqrt(R) * Sqrt(Max^2) = Sqrt(R) * Max,由于你的随机种子小于 1,它的平方根会更高,导致相反OP想要什么。我认为这种方法是正确的,如果您的随机数在 [1, Max^2] 的范围内,那么它的平方根将是您正在寻找的,但是由于您使用 Java 函数来实现这一点,那么您弄错了。
    猜你喜欢
    • 1970-01-01
    • 2012-11-25
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 2011-03-19
    相关资源
    最近更新 更多