struct Generator{
Generator() : val(0), count(0) {}
Generator(std::mt19937&& aGen) : val(0), count(0), theGen(aGen) {}
long long int operator()(void){
val = theGen();
std::cout << val << " " << count << std::endl;
++count;
return val;
}
long long int max(){return theGen.max();};
long long int min(){return theGen.min();};
long long int val;
size_t count;
std::mt19937 theGen;
};
3条答案
按热度按时间bpsygsoo1#
有时候,一个实用程序的行为是由标准明确定义的,有时候则不是。
1.看标准;如果找到,它是严格符合和便携式。
1.如果没有指定或明确定义实现,请查看您选择的标准库实现。源代码将对此进行解释。
不幸的是,它是由实现定义的,并且不可移植。如果由POSIX或类似的东西指定,你可以再次使用,但只适用于符合POSIX或"类似的东西"的平台。
下面是一个例子:
C++14标准草案N4296在§ 26.5.8.5.1中指出:
normal_distribution
随机数分布产生根据概率密度函数分布的随机数x
分布参数
µ
和σ
也称为该分布的平均值和标准差。我不知道PRNG,所以我不能解释这个公式给你,但我认为这是你一直在寻找的东西。
这里有一个函数(更具体地说:一个"概率密度函数"),用于使用正态分布计算随机数。整个算法围绕此构建,可以在相应的标准库实现中找到。
vdgimpew2#
我不得不写一个Wrapper类,如下所示:
来反省一下编译器是如何实现normal_distribution的。
为了看到它的实际效果,你必须沿着下面的思路写一些东西:
迭代地调用
dis(gen);
可能是有益的ux6nzvsh3#
正态分布见此处
核心逻辑是