【发布时间】:2015-04-23 01:54:21
【问题描述】:
我发生事件的概率非常小(顺序为 1e-5),并且正在尝试使用统一的随机数来测试是否成功。随着概率下降到 1e-4 左右,成功的比例不再匹配下面测试代码中的概率。
如何以如此小的概率准确检查成功?我尝试使用其他随机数生成器,但我发现的所有建议都是针对我没有使用的 C++11。非常感谢!
#include <cstlib>
#include <iostream>
#include <cmath>
double Prob, rand_num, frac_success;
int num_success, num_tries;
Prob = 1e-4;
num_tries = 1e8;
num_success = 0;
for (int i=0; i<num_tries; i++) {
rand_num = (double) rand() / RAND_MAX; // random number between 0 and 1
if (rand_num < Prob) {
num_success ++; // Record success
}
}
frac_success = double(num_success) / double(num_tries);
cout << Prob << endl << frac_success << endl;
当 Prob = 1e-3 时,成功率大致等于 Prob,但对于 Prob = 1e-4,它总是大于 1.2e-4。概率越低,差异越严重,并且似乎无法通过增加尝试次数来解决。
编辑:
正如 DiJuMx 和 Stefano Sanfilippo 所说,似乎 rand() 根本就不是一个足够好的生成器来使用。我决定改用 C++11,这样我就可以使用解决问题的 uniform_real_distribution(这意味着对其他非 C++11 代码的更改,但很高兴更改的内容比我预期的要少)。
【问题讨论】:
-
您使用的是什么平台?特别是
RAND_MAX是什么? -
你在某个时候打电话给
srand()吗? -
使用 g++ 4.8,
frac_success即使对于Prob = 1e-6也是准确的
标签: c++ random probability