std::uniform_int_distribution;范围为 g++和 MSVC
在做一个小型学校项目时,我刚刚注意到 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是
std::uniform_int_distribution
的 Visual Studio 2010 实现中的一个错误。我报告了它 此处于 2011 年 12 月得到 Stephan T. Lavavej 的确认:
当 std::uniform_int_distribution 构造函数的第一个参数为负数时,就会出现此错误。要在您的示例中解决这个问题,请像这样构造分布:
然后像这样调用它:
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:
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:And then call it like this:
如果属实,则这是 MSVC 实现中的一个错误。
If true, it's a bug in MSVC implementation.
MSDN 说:
意味着你的观察是错误的,或者实现中存在错误。这在源代码中应该很容易看到。
我还建议将 rng 设置为不同的值。这种行为变得更好的可能性非常非常低。
MSDN says:
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.