前向随机数的概率分布

时间:2011-08-12 22:09:09

标签: algorithm random probability

假设我伪随机地每秒从1到50伪随机选择一个数字,持续100秒,随着时间的推移,选择的数字更可能更大。我怎么能构建这样的算法?

例如:99秒后选择接近50的数字的概率比选择接近1的数字的可能性要大得多。

或者:10秒后挑选的数字更可能大于9秒后挑选的数字

4 个答案:

答案 0 :(得分:5)

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

现在,如果你从线性变换f(x)= x变换到提到的变换函数,例如一个简单的加权,你将获得所需的效果。

答案 1 :(得分:4)

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

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

这仍然会给你所有数字1..50。对于exp = 1,分布将是统一的。当你略微增加exp(例如1.1左右)时,获得更大数字的概率会增加。 exp越高,它越向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

答案 2 :(得分:1)

伪代码:

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这样的函数的启发。

答案 3 :(得分:0)

您正在做的事情可能更简单,但一般的解决方案是使用inverse transform sampling

基本上,如果要生成具有给定PDF的随机数 p(x),首先计算逆累积密度函数(CDF), P'(x) 。然后,您可以生成介于0和1之间的统一随机数,然后将 P'(x)应用于它们。