假设我每秒从1到50中伪随机地选择一个数字,持续100秒,随着时间的推移,所选数字更可能是较大的数字。如何构建这样的算法?
例如:在99秒后,选择接近50的数字的概率比选择接近1的数字的概率更大。
或者:在10秒后选择的数字比在9秒后选择的数字更可能是较大的数字。
假设我每秒从1到50中伪随机地选择一个数字,持续100秒,随着时间的推移,所选数字更可能是较大的数字。如何构建这样的算法?
例如:在99秒后,选择接近50的数字的概率比选择接近1的数字的概率更大。
或者:在10秒后选择的数字比在9秒后选择的数字更可能是较大的数字。
我有一个简单的解决方案。不要使用 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
伪代码:
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)。