2014-01-13 92 views
6

下面的代碼展示瞭如何在C++ 11中隨機加倍。每次在這個解決方案中,當我運行這個程序時結果都是一樣的 - 我不知道爲什麼?每次運行程序時如何更改它以獲得不同的解決方案?隨機雙C++ 11

#include <random> 
int main(int argc, char **argv) 
{ 
    double lower_bound = 0.; 
    double upper_bound = 1.; 
    std::uniform_real_distribution<double> unif(lower_bound, upper_bound); 
    std::default_random_engine re;  
    double a_random_double = unif(re); 
    cout << a_random_double << endl; 
    return 0; 
} 
//compilation: "g++ -std=c++0x program_name.cpp -o program_name" 
+1

給它一個種子值。順便說一句,能夠生成相同的「隨機」值序列對測試非常有用。 –

+0

沒有很好的理由使用'default_random_engine'。它基本上是「我不在乎」的引擎,但是爲什麼要使用它,比如'mt19937'這是高質量的*和*較短的類型。 –

+2

@CoryNelson'default_random_engine'對於對隨機引擎一無所知的人來說是明顯的選擇。這就是它存在的原因。首先看''的新手以及它對引擎和發行版的幾十個選項不太可能做出智能選擇所需的研究水平,他們只是想要一些有效的東西。我們應該很高興他們不使用'rand()'。 – Casey

回答

5

您需要先生成隨機數生成器,然後再生成樣本。您在構建default_random_engine實例時執行此操作。例如:

std::random_device rd; 
std::default_random_engine re(rd()); 

如果你想更加規範有關,那麼你使用的發電機應指定一個而不是依賴於庫實現者的選擇。default_random_engine。這裏列出了可用的選項:http://en.cppreference.com/w/cpp/numeric/random#Predefined_random_number_generators

還要注意某些實現不使用非確定性來源的random_device。如果您正面臨這樣的實施,您需要爲您的種子尋找替代來源。

+0

'std :: random_device {}()'是種子值的一個很好的選擇:'std :: default_random_engine re {std :: random_device {}()};' – Casey

+0

注意MinGW的意外默認種子: http://stackoverflow.com/q/18880654/417197 –

0

引擎未用種子初始化。

#include <chrono> 
... 
std::default_random_engine re(std::chrono::system_clock::now().time_since_epoch().count()); 
0

正如其他人已經指出,你沒有給發電機一個明確的種子。

讓我們來看看發生了什麼。 GCC實施std::default_random_engine作爲std::linear_congruential_engine<uint_fast32_t, 16807UL, 0UL, 2147483647UL>。當你編寫std::default_random_engine re;時,你可以調用這個沒有參數的類的構造函數,默認的種子值爲linear_congruential_engine::default_seed = 1u。所以如果你想要一個非1的種子,你必須自己提供。

參考:http://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a00860.html

2

你有一些初步的種子值初始化隨機引擎。
一個選項是使用std::random_device

#include <iostream> 
#include <random> 

int main() { 
    const double lower_bound = 0; 
    const double upper_bound = 1; 
    std::uniform_real_distribution<double> unif(lower_bound, upper_bound); 

    std::random_device rand_dev;   // Use random_device to get a random seed. 

    std::mt19937 rand_engine(rand_dev()); // mt19937 is a good pseudo-random number 
              // generator. 

    double x = unif(rand_engine); 
    std::cout << x << std::endl; 
} 

您可能想觀看偉大演示在線免費提供: 「rand() Considered Harmful」(從GoingNative 2013 C++ event)。