2014-09-30 112 views
0

我正在運行以下函數,並且它使用Visual Studio 2012給出的值在[範圍[高,低]範圍之外)(我得到的隨機數結果高於最高值我給了 - 例如1.8848149390180773爲[0.0,1.0))的範圍內:uniform_real_distribution給我的值超出範圍

double GetRandomDoubleBetween(double low, double high) 
{ 
    assert(low <= high); 
    static std::random_device rd; 
    static std::mt19937 rng(rd()); 
    static std::uniform_real_distribution<double> distribution(low, high); 
    double random = distribution(rng); 
    assert(random >= low); 
    assert(random < high); 
    return random; 
} 

我看到這個文檔的鏈接(http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution),這太問題(out of range random number generation in C++ using tr1),我沒有真正看到我在做什麼錯誤。

+1

代碼是否觸發其中一個斷言? – NPE 2014-09-30 06:00:41

+0

它可能與浮點比較的常見問題一樣簡單。 – juanchopanza 2014-09-30 06:02:35

+0

@juanchopanza他給出了一個值爲1.8848149390180773的範圍[0.0,1.0)。這比通常浮點問題可能導致的要大得多。 – 2014-09-30 08:11:42

回答

1

定義你的分配:

static std::uniform_real_distribution<double> distribution(low, high); 

注意static。這意味着distribution會在GetRandomDoubleBetween()的第一個呼叫中生成,lowhigh通過。下一次GetRandomDoubleBetween()distribution不是再次構建。

如果您使用不同參數呼叫GetRandomDoubleBetween(),則第二次呼叫將使用第一次呼叫中的lowhigh。如果您想支持不同的參數,請刪除static

另請注意,您的設計不是線程安全的。