gpt4 book ai didi

非常小概率的 C++ 随机数检查

转载 作者:行者123 更新时间:2023-11-30 05:47:15 25 4
gpt4 key购买 nike

我有一个事件发生的概率非常小(顺序为 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 值太小了。

考虑 rand() 返回 0RAND_MAX 之间的整数这一事实。如果将此数字除以 RAND_MAX,则除 0 外,您可以获得的最小数字是 1.0/RAND_MAX

RAND_MAX32767时,最小值为3e-5。然而,在我的机器上,RAND_MAX2147483647,所以最小值是 4e-10

或者,查看 Stefano 关于使用 C++ 特定库的回答。

关于非常小概率的 C++ 随机数检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28645030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com