指数生成器c++,有时返回inf
exponential number generator c++, sometimes returns inf
我正在进行模拟,我使用了一个函数来生成模拟指数分布的数字(我不想使用c++11函数)
这是代码
long double exponential(long double l)
{
long double mean = l;
long double u = ((long double)rand() / ((long double)RAND_MAX + 1.0));
return (-log(u) * mean);
}
有时返回的值是inf,你知道为什么吗,可能是0以某种方式出现了吗?
这是一个合乎逻辑的好结果。每个函数log(arg)
:
如果arg为
0
.在这种情况下返回CCD_ 3。
对于rand()
返回的零值,您有范围错误和inf
(无限)值。
根据定义,如果(分子(long double)rand()
为0),u
可能为零
已编辑
尝试:
long double exponential(long double l)
{
int NUM_TRIES = 1000; // How many times to mine a non zero u before giving up?
long double mean = l;
long double DEF = 1; // Put your default value here
long double u;
do {
u = ((long double)rand() / ((long double)RAND_MAX + 1.0));
}while(u == 0 && NUM_TRIES--);
if(NUM_TRIES == 0) {
return DEF;
} else if(u != 0) {
return (-log(u) * mean);
}
不要使用rand
rand
函数在这种情况和许多其他情况下被认为是邪恶的。既然你很幸运能使用C++,为什么不利用<random>
标头的美丽新功能呢?
你只需要使用std::uniform_real_distribution
就可以了:
std::random_device rnd_dev;
std::mt19937 gen(rnd_dev());
long double precision = 0.000001;
std::uniform_real_distribution<long double> dis(precision, 1.0 - precision);
std::cout << dis(gen) << 'n';
这是一个活生生的例子。
如果您仍然想使用rand
问题显然在于rand
返回0
,并且导致u
也是0
。在这种情况下,log
将按照您的问题中所述返回-inf
。
解决方案是查看您允许的最接近0
的数字:
long double u = rand() / (RAND_MAX + 1.0);
(重写的代码,因为结果总是一个浮点数),即:
long double precision = 1 / (RAND_MAX + 1.0);
从中可以很容易地看出,我们想要生成的数字在precision
和1.0 - precision
之间,这很容易通过实现
long double precision = 1 / (RAND_MAX + 1.0);
long double random = rand();
if (random == 0) random = precision;
long double u = random / (RAND_MAX + 1.0);
固定具有CCD_ 22的情况。
当然,随机分布不再是均匀的,因为u
成为precision
的概率几乎是任何其他数字的概率的两倍。但这是你以前遇到的问题(见第一个链接)。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何检查 log2 'inbuilt c++ function'是否返回 '-inf'?
- 获取从函数返回'-inf'
- 为什么当我尝试计算平均绝对偏差时,我的程序返回 inf
- 指数生成器c++,有时返回inf