根据离散函数概率返回int值

图1.1 左侧(期望结果);右侧(实现的算法代码)

笔者在阅读《算法》一书的时候看到这样一道示例题,刚开始没有想清楚,而后结合一些帖子和高数的知识便将算法想要传达的意思想明白了,下边我会从均匀分布函数开始记录笔者思考的过程。

图1.2 均匀分布

简单回顾均匀分布函数的知识,更多详情资料读者需自行查阅。 均匀分布也叫矩形分布,是指任意相同间隔所对应的概率分布都相等,该分布有两个参数:最小值(a)和最大值(b),缩写为U(a, b)。函数为:

当a=0,b=1时,为标准均匀分布。 对Java语言的Random库,似乎只能产生服从正态分布N(0,1)和均匀分布U(0,1)的随机数,那么如何按照特定的概率生成随机数呢?

X01
P(X = x)p1 – p

容易想到,对于服从均匀分布U(0,1)的随机变量,产生的随机数落在[0,p)的概率就为p, 而落在[p,1)的概率为1−p。
接下来,我们考虑稍微复杂的情况:

X012
P(X = x) p0p1p2

产生的随机数落在[0,p0​)的概率就为p0​, 而落在[p0​,p0​+p1​)的概率为p1​,落在[p0​+p1​,1),也就是落在[p0​+p1​,p0​+p1​+p2​)的概率为p2。以此类推,我们可以归纳出以下结论:

x012in
P(X = x) p0p1p2pipn

产生的随机数落在[∑k=0i−1​ pk​,∑k=0i​ pk​)的概率为pi​,由此我们可以考虑对p进行累加来求解问题,如图1.1。

结合均匀分布函数理解代码:
产生一个[0, 1]区间均匀分布的随机数r,若

r在[0, a[0])区间,x取0
r在[a[0], a[0] + a[1])区间,x取1;
r在[a[0] + a[1], a[0] + a[1] + a[2])区间 ,x取2;
...
r在[a[0] + a[1] + ... + a[n-2], 1)区间(相当于 [a[0] + a[1] + ... + a[n-2], [a[0] + a[1] + ... + a[n-2] + a[n-1] ) ) ,x取n-1。

由此,有P( X = i) = a[i] (i = 1, 2, 3, …, n-1)

参考资料: