创建偏向小数的随机数

3

假设我生成了一组随机数并将它们放入一个数组中(为简单起见,预先排序),我将使用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变量执行什么操作才能使它“偏爱”较小的数字?


1
如果你还不知道,你需要了解一下正态分布。烟花粒子在地面上的位置可能服从正态分布。 - Tim
转念一想,我同意正态分布比指数分布更适合。 - erickson
@lhf 刚刚注意到这条评论。是的,在那个线程中修改后的你提出的函数版本通常是我想要的。 - kona
2个回答

2
通常的方法(例如在此处解释)是定义你想要的分布函数,然后使用两种方法之一将均匀分布的随机变量转换为具有所需分布的随机变量。如果你的目标分布足够简单,你可以使用反函数变换采样
如果你并不关心分布函数的形式,只是希望它偏向于较小的值,则一个简单的方法可能是在[min2, max2]范围内生成一个均匀分布的随机变量,然后取其平方根作为你的随机变量。

0

你可以做任何事情。

例如:

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

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

好问题,我认为我需要在视觉上看到结果才能确定对于我正在使用的应用程序来说什么“看起来正确”。使用该函数,我如何操纵分布? - kona
没错。立方根的立方比平方根的平方更倾向于小数,以此类推。同样地,你可以取指数的对数,这会给你一个不同的形状。可能性是无限的,如果你只想要一个快速、任意的分布,那么它们都很好,但如果你需要更具体的东西,那么你应该考虑@Ted Hopp的答案。 - Jean-François Corbett
这是一个错误的答案。Sqrt(R * Max^2) = Sqrt(R) * Sqrt(Max^2) = Sqrt(R) * Max,但由于您的随机种子小于1,其平方根将会更高,导致与 OP 想要的相反。 我认为方法是正确的,如果您的随机数在 [1, Max^2] 范围内,那么它的平方根将是您要寻找的,但由于您使用的是 Java 函数来实现这一点,所以结果不正确。 - kermit11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接