有一个给定的浮点数序列(在 0 和 1 之间),长度为 N,表示整数 0..N-1 上的分布函数。我们试图从这个分布中抽取一个随机数。一种方法是在 [0, 1] (float) 中绘制一个均匀随机变量,然后计算该数字的逆累积分布函数。
如果分布在一个数组中,代码将如下所示:
let matched distribution draw =
let rec matchRest distribution draw start =
if start = Array.length distribution then start-1
else
let left = draw - distribution.[start]
if left <= 0 then start
else matchRest distribution left (start+1)
matchRest distribution draw 0
其中distribution
是分布函数,draw
是统一的 [0,1] 数。
当分布是任何序列时,如何重写此函数以工作?显然我可以创建一个临时数组,但这似乎不是一个优雅的解决方案......