簡體   English   中英

的std :: uniform_int_distribution <int> g ++和msvc的范圍

[英]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的確認:

  1. 確實是一個錯誤。
  2. 下一版本的Visual Studio(包括當前的Developer Preview )已對其進行了修復。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM