一个概率分布函数只是一个函数,当您输入一个值X时,它将返回获得该值X的概率。累积分布函数是获得小于或等于X的数字的概率。 CDF是PDF的积分。 CDF几乎总是一对一的函数,因此它几乎总是具有反函数。
要生成PDF,请在x轴上绘制值,在y轴上绘制概率。所有概率的总和(离散)或积分(连续)应加起来为1。找到正确模拟该方程的某个函数。为此,您可能需要查找一些PDF。
基本算法
https://en.wikipedia.org/wiki/Inverse_transform_sampling
这个算法基于反变换抽样。ITS 的背后思想是,你随机选择了一个 CDF 的 y 轴上的值,并找到它所对应的 x 值。这是有道理的,因为一个值被随机选中的可能性越大,在 CDF 的 y 轴上占据的"空间"就越多。
- 构思概率分布公式。例如,如果希望随着数字变大选择它们的几率增加,可以使用像 f(x)=x 或 f(x)=x^2 这样的公式。如果希望在中间部分凸出,可以使用高斯分布或 1/(1+x^2)。如果要使用有界公式,可以使用贝塔分布或库马拉斯瓦米分布。
- 对 PDF 进行积分得到累积分布函数。
- 找到 CDF 的反函数。
- 生成随机数并将其插入反函数中。
- 将结果乘以(max-min),然后加上 min。
- 将结果四舍五入到最近的整数。
步骤1到3是您必须在游戏中硬编码的内容。任何PDF文件的唯一解决方法是解出对应于其平均值的形状参数,并满足您希望形状参数具有的约束条件。如果您想使用Kumaraswamy分布,您将设置它,使得形状参数a和b始终大于一。
我建议使用Kumaraswamy分布,因为它是有界的,并且具有非常好的封闭形式和封闭形式的逆。它只有两个参数a和b,并且非常灵活,可以模拟许多不同的情况,包括多项式行为、钟形曲线行为和在两端都有峰值的盆地状行为。此外,使用这个函数进行建模并不太难。形状参数b越高,它就越向左倾斜,而形状参数a越高,它就越向右倾斜。如果a和b都小于1,则分布将看起来像槽或盆地。如果a或b等于1,则分布将是一个不会从0到1改变凹度的多项式。如果a和b都等于1,则分布是一条直线。如果a和b大于1,则函数将看起来像钟形曲线。学习这个最好的方法就是实际绘制这些函数或运行Inverse Transform Sampling算法。
https://en.wikipedia.org/wiki/Kumaraswamy_distribution
例如,如果我想要一个从0到100、a=2、b=5的概率分布如此形状的分布:
https://www.wolframalpha.com/input/?i=2*5*x%5E(2-1)*(1-x%5E2)%5E(5-1)+from+x%3D0+to+x%3D1
它的CDF将是:
CDF(x)=1-(1-x^2)^5
它的反函数将是:
CDF^-1(x)=(1-(1-x)^(1/5))^(1/2)
Kumaraswamy分布的一般反函数为:
CDF^-1(x)=(1-(1-x)^(1/b))^(1/a)
然后我会生成一个从0到1的数字,将其放入CDF^-1(x),并将结果乘以100。
优点
- 非常准确
- 连续的,而不是离散的
- 使用一个公式和极少的空间
- 让您对随机性的分布有很大的控制权
- 许多这些公式具有某种反函数的CDF
- 有一些方法来限制两端的函数。例如,Kumaraswamy分布从0到1被限制,因此您只需输入介于零和一之间的浮点数,然后将结果乘以(max-min)并加上min。Beta分布根据传递给它的值而有不同的边界。对于像PDF(x)= x这样的东西,CDF(x)=(x ^ 2)/ 2,因此您可以从CDF(0)到CDF(max-min)生成随机值。
缺点
- 您需要确定计划使用的精确分布及其形状
- 您计划使用的每个通用公式都需要硬编码到游戏中。换句话说,您可以将Kumaraswamy分布编程到游戏中,并拥有一个基于分布及其参数a和b生成随机数的函数,但不能编写一个为您生成分布的函数,该函数基于平均值。如果您想使用Distribution x,则必须找出最适合您要查看的数据的a和b值,并将这些值硬编码到游戏中。