Mar*_*rio 1 c++ random gcc visual-c++
在做一个小学校项目时,我只是注意到以下范围的差异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();
}
Run Code Online (Sandbox Code Playgroud)
使用 g++ 时会在某个时候显示 -1,但使用 msvc 时永远不会显示 -1。
我知道编译器之间存在这种差异是很常见的,但是请注意 MSDN 文档和范围应该是 [a, b] 的标准标记。
这种行为的原因是什么?
这是 Visual Studio 2010 实现中的一个错误std::uniform_int_distribution。
我于 2011 年 12 月在这里报告了它,并得到了 Stephan T. Lavavej 的确认:
当std::uniform_int_distribution构造函数的第一个参数为负数时,就会出现该错误。要在您的示例中解决此问题,请构建如下分布:
std::uniform_int_distribution<int> intDist(0, 2);
Run Code Online (Sandbox Code Playgroud)
然后像这样调用它:
cout << intDist(random) - 1 << "\n";
Run Code Online (Sandbox Code Playgroud)