整数 0..N-1 の分布関数を表す有限長 N の float (0 と 1 の間) の与えられたシーケンスがあります。この分布から乱数を抽出しようとしています。これを行う 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] 数です。
配布が任意のシーケンスの場合に機能するようにこの関数を書き直すにはどうすればよいですか? 明らかに、一時的な配列を作成できますが、それはエレガントなソリューションではないようです...