我不使用 Python,因此我将尝试从算法上描述解决方案,而不是冒语法错误的风险。这是一个蛮力的离散反演。它应该很容易翻译成 Python。我假设数组的索引是从 0 开始的。
设置:
生成大小为m 的数组cdf,第一个条目为cdf[0] = 1,其余条目为cdf[i] = cdf[i-1] + 1/(i+1)**a。
通过将 cdf[m-1] 划分为每个条目来缩放所有条目 - 现在它们实际上是 CDF 值。
用法:
- 通过生成 Uniform(0,1) 和
搜索
cdf[],直到找到大于您的条目
制服。返回索引 + 1 作为您的 x-value。
重复任意数量的x-values。
例如,对于a,m = 2,10,我直接计算概率为:
[0.6452579827864142, 0.16131449569660355, 0.07169533142071269, 0.04032862392415089, 0.02581031931145657, 0.017923832855178172, 0.013168530260947229, 0.010082155981037722, 0.007966147935634743, 0.006452579827864143]
CDF 是:
[0.6452579827864142, 0.8065724784830177, 0.8782678099037304, 0.9185964338278814, 0.944406753139338, 0.9623305859945162, 0.9754991162554634, 0.985581272236501, 0.9935474201721358, 1.0]
生成时,如果我得到 0.90 的统一结果,我将返回 x=4,因为 0.918... 是第一个大于我的统一的 CDF 条目。
如果您担心速度,您可以构建一个别名表,但由于几何衰减,通过数组的线性搜索提前终止的可能性非常高。例如,对于给定的示例,您将在几乎 2/3 的时间内在第一次查看时终止。