gpt4 book ai didi

c++ - uniform_real_distribution 没有给出均匀分布

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:25:14 29 4
gpt4 key购买 nike

我试图在我的项目中生成 (0,1) 范围内的高质量随机数,我尝试从 here 的示例代码中测试 uniform_real_distribution .当我运行它时,代码运行良好,但是当我尝试通过播种生成器来修改代码时,例如:

#include <random>
#include <iostream>
#include <chrono>

using namespace std;
// obtain a seed from the system clock:
unsigned seed = static_cast<int> (chrono::system_clock::now().time_since_epoch().count());

// globally defining the generator and making it static for safety because in the
// actual project this might affect the flow.

static default_random_engine gen(seed);
uniform_real_distribution<double> distribution(0.0,1.0);

int main(){
const int nrolls=10000; // number of experiments
const int nstars=95; // maximum number of stars to distribute
const int nintervals=10; // number of intervals

int p[nintervals]={};

for (int i=0; i<nrolls; ++i) {
double number = distribution(gen);
++p[int(nintervals*number)];
}

std::cout << "uniform_real_distribution (0.0,1.0):" << std::endl;
std::cout << std::fixed; std::cout.precision(1);

for (int i=0; i<nintervals; ++i) {
std::cout << float(i)/nintervals << "-" << float(i+1)/nintervals << ": ";
std::cout << std::string(p[i]*nstars/nrolls,'*') << std::endl;
}

return 0;

}

随机数不是均匀分布的。重复执行时的输出是:

F:\path>randtest

uniform_real_distribution (0.0,1.0):

0.0-0.1: *********

0.1-0.2: **********

0.2-0.3: ********

0.3-0.4: *********

0.4-0.5: *********

0.5-0.6: *********

0.6-0.7: *********

0.7-0.8: *********

0.8-0.9: *********

0.9-1.0: **********

F:\path>randtest

uniform_real_distribution (0.0,1.0):

0.0-0.1: *********

0.1-0.2: *********

0.2-0.3: *********

0.3-0.4: *********

0.4-0.5: *********

0.5-0.6: *********

0.6-0.7: *********

0.7-0.8: *********

0.8-0.9: *********

0.9-1.0: *********

F:\path>randtest

uniform_real_distribution (0.0,1.0):

0.0-0.1: *********

0.1-0.2: *********

0.2-0.3: *********

0.3-0.4: *********

0.4-0.5: **********

0.5-0.6: *********

0.6-0.7: *********

0.7-0.8: *********

0.8-0.9: *********

0.9-1.0: *********

是因为播种吗?还是使用不同的生成器更好?

我使用 G++ 5.1.0 编译器 c++11 标准。

最佳答案

如果您抛硬币一次,它是正面朝上,那么下次您抛硬币时它是否总是反面朝上?

硬币在集合 {heads, tails} 上产生均匀分布。这并不意味着对于任何一组翻转,正面和反面的数量是相等的。事实上,当您抛掷更多硬币时,恰好发生这种情况的可能性会下降

在您的例子中,每个间隔都有 10% 的机会被选中。

这种选择的方差是 (0.1)(1-.1),即 0.09。

期望值为 0.1。

经过 10000 次尝试后,预期值为 1000。

方差将为 900。

900 的方差对应于 30 的标准差。

95-ish% 的置信区间是 2 个标准差(实际上是 1.96,但谁在乎)。

因此您应该期望这些值通常介于 940 和 1060 之间。

95颗星,每颗星对应10000/95=105个元素。

940/105 约为 8.951060/105 约为 10.06

因此,您通常会在每列上看到 8 到 10 颗星。假设向下舍入,即使在 10 个反相关样本上,达到 7 或 11 颗星也应该是非常罕见的(因为相差 3 个标准差)。

这一切都假设一个完美的均匀随机分布。当这对您观察到的行为建模时,您的问题在于数学和均匀随机分布的定义,而不是 C++ 语言。

如果您想要完美的直方图,请不要使用均匀随机分布。例如,您可以简单地从 0 开始,然后每次添加 0.0001。调用 10001 次后,您将得到一个从 0 到 1 的统一直方图。

均匀随机简单的说就是每个区域的概率是一样的。

关于c++ - uniform_real_distribution 没有给出均匀分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39776049/

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