g++ 和 msvc 中的 std::uniform_int_distribution<int> 范围

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] 的标准标记。

这种行为的原因是什么?

Spi*_*ire 5

这是 Visual Studio 2010 实现中的一个错误std::uniform_int_distribution

我于 2011 年 12 月在这里报告了它,并得到了 Stephan T. Lavavej 的确认:

  1. 这确实是一个错误。
  2. 它已在 Visual Studio 的下一个版本(包括当前的Developer Preview)中得到修复。

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)