在指定范围内使用指数分布创建随机数?
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。
我需要在用户指定的范围内创建随机数。我了解如何创建随机数并参考
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。