[英]Use std::uniform_int_distribution and define its range later
[英]std::uniform_int_distribution<int> range in g++ and msvc
在做一個小型學校項目時,我只注意到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月在這里舉報了此事,並得到了Stephan T. Lavavej的確認:
當std::uniform_int_distribution
構造函數的第一個參數為負數時,會發生此錯誤。 要在您的示例中解決此問題,請按以下方式構建分布:
std::uniform_int_distribution<int> intDist(0, 2);
然后像這樣調用它:
cout << intDist(random) - 1 << "\n";
這種行為的原因是什么?
如果為true,則是MSVC實現中的錯誤。
MSDN說 :
第一個成員運算符使用引擎eng作為均勻分布的積分值的來源,並返回積分值,其中每個值i在閉合范圍[min(),max()]中以相等的概率發生,並且在該范圍之外的值以概率0發生。
這意味着您的觀察是錯誤的,或者實施中存在缺陷。 這應該很容易在源代碼中看到。
我還建議將rng播種到不同的值。 行為變得更好的可能性非常非常低。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.