a[N]为一位数组,根据a[i]返回X,使得P(X = i) = a[i]。
public static int discrete(double[] a) {
double r = StdRandom.random();
double sum = 0.0;
for (int i = 0; i < a.length; i++) {
sum = sum + a[i];
if (sum >= r) return i;
}
return -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)区间,X取 n - 1;
采用这种取法,有P(X = i) = a[i]。(i=1,2,3, ..., n-1)