std::uniform_int_distribution;范围为 g++和 MSVC

发布于 2024-12-10 06:40:39 字数 623 浏览 0 评论 0原文

在做一个小型学校项目时,我刚刚注意到 std::uniform_int_distribution 的范围:

使用 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]。

这种行为的原因是什么?

While doing a minor school project, I just noticed a difference in the
range of std::uniform_int_distribution<int>:

When using g++ the range is [a, b], however when using msvc (Visual Studio 2010) the range is (a, b], so the output of the following program:

#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();
}

Will display -1 at some point when using g++, but it will never display -1 when using msvc.

I know is common that such differences exists between compilers, but booth the MSDN documentation and the standard mark that the range should be [a, b].

What is the reason for this behavior?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

无声情话 2024-12-17 06:40:39

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

我报告了它 此处于 2011 年 12 月得到 Stephan T. Lavavej 的确认:

  1. 这确实是一个错误。
  2. 该问题已在下一版本的 Visual Studio(包括当前的开发者预览版)中得到修复。

当 std::uniform_int_distribution 构造函数的第一个参数为负数时,就会出现此错误。要在您的示例中解决这个问题,请像这样构造分布:

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

然后像这样调用它:

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

It's a bug in the Visual Studio 2010 implementation of std::uniform_int_distribution.

I reported it here in December 2011 and got confirmation from Stephan T. Lavavej that:

  1. It is indeed a bug.
  2. It's been fixed in the next version of Visual Studio (including the current Developer Preview).

The bug occurs when the first parameter to the std::uniform_int_distribution constructor is negative. To work around it in your example, construct the distribution like this:

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

And then call it like this:

cout << intDist(random) - 1 << "\n";  
凉城已无爱 2024-12-17 06:40:39

造成这种行为的原因是什么?

如果属实,则这是 MSVC 实现中的一个错误。

What is the reason for this behavior?

If true, it's a bug in MSVC implementation.

心如狂蝶 2024-12-17 06:40:39

MSDN 说

第一个成员运算符使用引擎 eng 作为均匀分布积分值的源,并返回积分值,其中每个值 i 在封闭范围 [min(), max()] 内以相等的概率出现,而在该范围之外的值则以相同的概率出现概率为 0。

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

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

MSDN says:

The first member operator uses the engine eng as a source of uniformly distributed integral values and returns integral values with each value i in the closed range [min(), max()] occurring with equal probability and values outside that range occurring with probability 0.

This means that your observation is wrong, or there is abug in the implementation. This should be easy to see in the source.

I also suggest seeding the rng to a different value. There is a very very very low possibility of the behaviour turning out better.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文