前倾随机数的概率分布



假设我在100秒内伪随机地从1到50中选择一个数字,随着时间的推移,所选择的数字更有可能更大。我该如何构建这样一个算法?

例如:99秒后,选择一个更接近50的数字的概率比选择一个更接近1的数字的概率要大得多。

或者:10秒后摘到的号码更有可能大于9秒后摘到的号码

选择任意凹单调函数,如将0映射到0和1映射到1的平方根。在[0,1]之间生成一个随机数,应用该函数,然后将[0,1]划到所需的间隔([1,50])

现在,如果你从线性变换f(x)=x变换到前面提到的变换函数,比如一个简单的加权,你就会得到想要的效果。

我有一个简单的解决方案。而不是rand(1, 50)(假设这个函数生成一致的随机数1..50)使用这个表达式:

power(rand(1, power(50, exp)), 1/exp)

这仍然会给你所有的数字1…50。对于exp = 1,分布是均匀的。当你稍微增加exp(例如1.1左右)时,获得更大数字的概率将会增加。经验值越高,越接近50。

所以你可以这样做:

factor = 1 /* finetune this for your needs */
for second = 0..100
    exp = 1 + (second / 100) * factor
    rand_num = power(rand(1, power(50, exp)), 1/exp)
endfor

伪代码:

let i = 0
let n = 50 // Adjust for your needs
for i goes to 100 {
  randomnum = int(sqrt(rand(1, 50*n)));
}

这可能是非常前瞻性的,但这是一种接近它的方法。

感谢Ricky Bobby指出了我旧方法的一个基本问题。这是受到yi_H建议使用sqrt这样的函数的启发。

对于您正在做的事情可能有更简单的方法,但一般的解决方案是使用逆变换采样。

本质上,如果你想用给定的PDF生成一个随机数p(x),你首先计算逆累积密度函数(CDF) p '(x)。然后可以生成0到1之间的均匀随机数,然后对它们应用P'(x)

最新更新