我正在尝试在项目中生成范围(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:\路径&GT; 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:\路径&GT; 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:\路径&GT; 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标准。
答案 0 :(得分:9)
如果你翻了一次硬币并且它落在了头上,那么下次你翻转时它会不会落在尾巴上?
硬币在集{heads, tails}
上产生均匀分布。这并不意味着任何一组翻转,头部和尾部的数量是相等的。事实上,当您翻转更多硬币时,发生完全的可能性 down 。
在您的情况下,每个间隔都有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.95 1060/105约为10.06
因此,您通常会在每列上看到8到10颗星。假设四舍五入,即使在10个反相关样本上,击中7或11颗恒星也应该是非常罕见的(即距离3 SD)。
这都假定一个完美的均匀随机分布。由于这会模拟您观察到的行为,因此您的问题在于数学和统一随机分布的定义,而不是C ++语言。
如果您想要完美的直方图,请不要使用均匀的随机分布。例如,您可以简单地从0开始,然后每次添加0.0001。在10001次调用之后,您将拥有从0到1的统一直方图。
统一随机只是意味着每个区域的机会相同。