在指定范围内使用指数分布创建随机数?

Creating random number using Exponential distribution in a specified range?

我需要在用户指定的范围内创建随机数。我了解如何创建随机数并参考 那个问题。但是,我需要我的随机数在一个范围内。我写了一段代码,尽管它在理论上可行,因为它计算的数字非常少,接近 0 并给出错误的数字。 我的密码是

        double u;
        double p1 =  -1.0 *  lambda * minvalue;
        double p2 =  -1.0 *  lambda * maxvalue;
        double a_min =  1 - exp(p1);
        double a_max =  1 - exp(p2);
        u = (rand() / (RAND_MAX + 1.0));
        double diff = a_min - a_max;
        u = u * (a_min - a_max);
        u = u + a_max;
        double p3 = 1.0- u;
        int x = (int)(-log(p3) / lambda);
        return x;

lambda、minvalue和maxvalue都是整数。我该如何处理这个问题,还有其他解决方案吗?

我的代码处理的数字非常少,因此四舍五入为 0,结果计算错误。

请您尝试以下操作:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/*
 * note: lambda should be a positive number
 *       min and max should be non-negative and min < max
 */
double rand_exp(int lambda, int min, int max)
{   
    double u_min = exp(-min * lambda);
    double u_max = exp(-max * lambda);

    double u = u_min + (1.0 - rand() / (RAND_MAX + 1.0)) * (u_max - u_min);
    return -log(u) / lambda;
}
  • 请注意函数不检查非法参数。
  • 我已将函数定义为 return 双精度值,因为它是 更容易测试输出。请根据您的要求将其转换为 int。