假设我伪随机地每秒从1到50伪随机选择一个数字,持续100秒,随着时间的推移,选择的数字更可能更大。我怎么能构建这样的算法?
例如:99秒后选择接近50的数字的概率比选择接近1的数字的可能性要大得多。
或者:10秒后挑选的数字更可能大于9秒后挑选的数字
答案 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)应用于它们。