问题
假设我们的计算机可以生成在0,1之间均匀分布的连续型随机变量R,试编写一个算法根据任意给定离散型随机变量X的分布列生成服从该分布的随机数。
分析
这相当于要我们设计一个包含随机变量R的实验,使得.
实现
编写Java代码如下:
package app;
import edu.princeton.cs.algs4.*;
public class ran {
public static void main(String[] args) {
double[] a = {0.05, 0.15, 0.2, 0.6};
for (int i = 0; i < 11; i++)
{
StdOut.print(discreate(a));
StdOut.print(' ');
}
}
public static int discreate(double[] a)
{
double r = StdRandom.random();
double sum = 0.0;
for (int i = 0; i < a.length; i++)
{
sum += a[i];
if (sum >= r) return i;
}
return -1;
}
}
证明
思路是,考虑事件:上述函数discreate返回[0, a.length)之间的整数k。该事件等价于:随机变量R的取值在[0, k-1]概率之和与[0, k]概率之和之间。可以证明,这个事件的概率等于X取k的概率。
其中,第二行由均匀分布的性质得到。