2011-10-15 49 views
1

雖然做一個小的學校的項目,我只注意到在 範圍std::uniform_int_distribution<int>一個區別:的std :: uniform_int_distribution <int>範圍G ++和MSVC

當使用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(); 
} 

可否使用克++時在某一時刻顯示-1,但它絕不會顯示-1時使用msvc。

I知道編譯器之間存在這種差異是很常見的,但展位MSDN文檔和範圍應該是[a,b]的標準標記。

這種行爲的原因是什麼?

回答

4

這是Visual Studio 2010實現std::uniform_int_distribution中的一個錯誤。

我在2011年12月報告說,它here並得到確認,從斯蒂芬T. Lavavej說:

  1. 這的確是一個錯誤。
  2. 已在下一版本的Visual Studio中修復(包括當前的Developer Preview)。

std::uniform_int_distribution構造函數的第一個參數爲負時,會發生該錯誤。要解決它在你的榜樣,構建這樣的分配:

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

然後調用它像這樣:

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

這種行爲的原因是什麼?

如果爲true,那是MSVC實現中的一個錯誤。

-1

MSDN says

第一構件操作者使用發動機ENG作爲均勻地分佈積分值的源,並與每個值i在閉合範圍返回積分值[(分鐘),MAX()]存在以相同的概率和超出該範圍的值以概率0發生。

這意味着您的觀察結果是錯誤的,或者在執行過程中存在缺陷。這應該很容易在源代碼中看到。

我也建議種子rng不同的價值。這種行爲表現得更好的可能性非常低。