2009-07-13 56 views
9

我試圖使用C++ STD TechnicalReport1擴展,產生以下正態分佈的數字,但是這個代碼(改編自this article):只有C++ TR1:如何使用normal_distribution?

mt19937 eng; 
eng.seed(SEED); 

normal_distribution<double> dist; 
// XXX if I use the one below it exits the for loop 
// uniform_int<int> dist(1, 52); 

for (unsigned int i = 0; i < 1000; ++i) { 
    cout << "Generating " << i << "-th value" << endl; 
    cout << dist(eng) << endl; 
} 

打印1「生成......」日誌消息,那麼永遠不會退出for循環!如果我使用我註釋掉的分佈,它會終止,所以我想知道我在做什麼錯了。任何想法?

非常感謝!

回答

2

這肯定不會掛起程序。但是,不知道它是否真的符合您的需求。

#include <random> 
#include <iostream> 

using namespace std; 

typedef std::tr1::ranlux64_base_01 Myeng; 

typedef std::tr1::normal_distribution<double> Mydist; 

int main() 
{ 
     Myeng eng; 
     eng.seed(1000); 
     Mydist dist(1,10); 

     dist.reset(); // discard any cached values 
     for (int i = 0; i < 10; i++) 
     { 
      std::cout << "a random value == " << (int)dist(eng) << std::endl; 
     } 

return (0); 
} 
+0

感謝男人,它的作品像一個魅力,但我想知道爲什麼這個引擎的工作,而不是與其他.. – puccio 2009-07-13 10:52:32

+0

顯然唯一的區別是你使用 mt19937號碼生成器,而Jagannath使用std :: tr1 :: ranlux64_base_01。從邏輯上講,我猜這個bug可能是在你的實現mt19937對象(我之前從未聽說過的算法,thx for this :-))中,它不是std庫的一部分。 – 2010-08-06 11:08:24

1

雖然這看起來是一個錯誤,但快速確認將通過默認的0.0,1.0參數。 normal_distribution<double>::normal_distribution()應該等於normal_distribution<double>::normal_distribution(0.0, 1.0)

+0

它也不起作用,它仍然堅持執行第一次計算.. – puccio 2009-07-13 10:20:47

2

如果您的TR1隨機數生成實現有問題,您可以通過編寫自己的普通生成器來避免TR1,如下所示。

使用您信任的任意隨機生成器生成兩個均勻(0,1)隨機樣本u和v。然後讓r = sqrt(-2 log(u))並返回x = r sin(2 pi v)。 (這稱爲Box-Mueller方法。)

如果您需要平均mu和標準偏差sigma的正常樣本樣本,則返回sigma * x + mu而不是x。

7

我曾與最初發布的代碼相同的問題,並研究了GNU實施

第一一些意見: 使用g ++ - 4.4和使用代碼掛起, 使用g ++ - 4.5和使用-std =的C++ 0x(即不TR1,但真實的東西)上面的代碼工作

恕我直言,有TR1之間的變化的C++ 0x關於隨機數生成隨機數的消費之間的適配器 - mt19937產生整數,normal_distribution消耗雙打

中的C++ 0x採用自適應自動的G ++ TR1代碼不

爲了得到你的代碼使用g ++工作 - 4.4和TR1,請執行下列操作

std::tr1::mt19937 prng(seed); 
std::tr1::normal_distribution<double> normal; 
std::tr1::variate_generator<std::tr1::mt19937, std::tr1::normal_distribution<double> > randn(prng,normal); 
double r = randn(); 
相關問題