std :: uniform_int_distribution <int>以g ++和msvc </int>为单位的范围

时间:2011-10-15 21:57:07

标签: c++ gcc visual-c++ random

在做一个小型学校项目时,我只是注意到了一个不同之处 范围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]范围。

这种行为的原因是什么?

3 个答案:

答案 0 :(得分:4)

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

我在2011年12月报告了here并得到了Stephan T. Lavavej的确认:

  1. 这确实是一个错误。
  2. 已在下一版本的Visual Studio中修复(包括当前的Developer Preview)。
  3. std::uniform_int_distribution构造函数的第一个参数为负数时,会发生错误。要在您的示例中解决此问题,请按以下方式构建分发:

    std::uniform_int_distribution<int> intDist(0, 2);
    

    然后像这样称呼它:

    cout << intDist(random) - 1 << "\n";  
    

答案 1 :(得分:0)

  

这种行为的原因是什么?

如果为true,则是MSVC实现中的错误。

答案 2 :(得分:-1)

MSDN says

  

第一个成员运算符使用引擎eng作为均匀分布的积分值的来源,并返回积分值,其中每个值i在闭合范围[min(),max()]中以相等的概率发生,并且该值超出该范围概率为0.

这意味着您的观察是错误的,或者实施中存在缺陷。这应该很容易在源代码中看到。

我还建议将rng播种到不同的值。行为变得更好的可能性非常低。