在做一个小型学校项目时,我只是注意到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]。
这种行为的原因是什么?
最佳答案
这是Visual Studio 2010实现std::uniform_int_distribution
中的错误。
我在2011年12月将其报告为here,并得到了Stephan T. Lavavej的确认:
当
std::uniform_int_distribution
构造函数的第一个参数为负数时,会发生该错误。要在您的示例中解决该问题,请按以下方式构建分布:std::uniform_int_distribution<int> intDist(0, 2);
然后这样称呼它:
cout << intDist(random) - 1 << "\n";
关于c++ - g++和msvc中的std::uniform_int_distribution <int>范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7780918/