在做一个小型学校项目时,我只是注意到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的确认:

  • 确实是一个错误。
  • 在Visual Studio的下一版本(包括当前的Developer Preview)中已修复。

  • 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/

    10-13 07:31
    查看更多