在做一个小型学校项目时,我只是注意到了一个不同之处
范围std::uniform_int_distribution<int>
:
使用g ++时,范围是[a,b],但是当使用msvc(Visual Studio 2010)时,范围是(a,b),所以输出以下程序:
#include <iostream>
#include <random>
using std::cout;
using std::cin;
int main()
{
std::mt19937 random;
std::uniform_int_distribution<int> intDist(-1, 1);
for(int i = 0; i < 100; i++)
{
cout << intDist(random) << "\n";
}
cin.get();
}
使用g ++时会在某个时刻显示-1,但在使用msvc时它永远不会显示-1。
我知道在编译器之间存在这种差异是很常见的,但是在MSDN文档和标准标记上应该是[a,b]范围。
这种行为的原因是什么?
答案 0 :(得分:4)
这是std::uniform_int_distribution
的Visual Studio 2010实现中的一个错误。
我在2011年12月报告了here并得到了Stephan T. Lavavej的确认:
当std::uniform_int_distribution
构造函数的第一个参数为负数时,会发生错误。要在您的示例中解决此问题,请按以下方式构建分发:
std::uniform_int_distribution<int> intDist(0, 2);
然后像这样称呼它:
cout << intDist(random) - 1 << "\n";
答案 1 :(得分:0)
这种行为的原因是什么?
如果为true,则是MSVC实现中的错误。
答案 2 :(得分:-1)
第一个成员运算符使用引擎eng作为均匀分布的积分值的来源,并返回积分值,其中每个值i在闭合范围[min(),max()]中以相等的概率发生,并且该值超出该范围概率为0.
这意味着您的观察是错误的,或者实施中存在缺陷。这应该很容易在源代码中看到。
我还建议将rng播种到不同的值。行为变得更好的可能性非常低。