Java按照指数分布实现随机数

先给出指数分布的公式:


f(x;\lambda) = \left\{\begin{matrix}
\lambda e^{-\lambda x} &,\; x \ge 0, \\
0 &,\; x < 0.
\end{matrix}\right.

其中λ > 0是分布的一个参数,常被称为率参数(rate parameter)。即每单位时间发生该事件的次数。指数分布的区间是[0,∞)。 如果一个随机变量X 呈指数分布,则可以写作:X ~ Exponential(λ)。

累积分布函数可以写成:


F(x;\lambda) = \left\{\begin{matrix}
1-e^{-\lambda x}&,\; x \ge 0, \\
0 &,\; x < 0.
\end{matrix}\right.

之所以需要累积分布是因为后面会用到。下面结合代码进行说明:

public int rand (double lambda) {
    Random random = new Random();
    double u = random.nextDouble();

    int x = 0;
    double cdf = 0;
    while (u >= cdf) {
        x ++;
        cdf = 1 - Math.exp(-1.0 * lambda * x);
    }
    return x;
}

首先生成一个0到1之间的一个随机的double U作为基础,然后开始寻找我们需要的整数,根据累积分布的公式,0对应的累积分布为0;整个方法的核心是理解while循环的意义:不断增加X,直到累积分布达到随机数U,这其实也是概率的原始定义。理解了这一点,将指数分布换成其它分布也是同样的道理。


作为验证,选取λ =0.1,执行如下代码:

public static void main(String[] args) {
    DemoTest demoTest = new DemoTest();
    double lambda = 0.1;
    int arr[] = new int[100];
    for (int i = 0; i < 10000; i++) {
        int rand = demoTest.rand(lambda);
        if (rand < 100) {
            arr[rand] ++;
        }
    }
    for (int i = 1; i < 100; i++) {
        System.out.println(arr[i]);
    }
}

得到的结果整理如下图:

Java按照指数分布实现随机数_第1张图片

你可能感兴趣的:(Java按照指数分布实现随机数)