2013-02-19 41 views
1

我在想,normal_distribution函數使用什麼樣的隨機數生成器?模擬應用的C++ normal_distribution函數

它適合科學模擬應用嗎?

問候

+0

這完全取決於你的用例嗎? – 111111 2013-02-19 19:24:31

+0

用於模擬應用程序。 如果你告訴我使用Mersenne-Twister發生器,它會很好! – Aleanar 2013-02-19 19:30:21

+0

請參閱此處的示例以瞭解如何使用正態分佈的Mersenne-Twister:http://en.cppreference.com/w/cpp/numeric/random/normal_distribution – 111111 2013-02-19 19:33:47

回答

3

std::normal_distribution沒有做任何的隨機數生成。這是一個隨機數字分佈。隨機數分佈只映射由隨機數引擎返回某種分佈的值。他們自己不會做任何一代人。所以它是你關心的隨機數引擎

標準提供的隨機數引擎之一,std::mersenne_twister_engine是一個非常高質量的隨機數引擎。您可以使用它,象這樣的正態分佈產生隨機數:

std::random_device rd; 
std::mt19937 gen(rd()); // Create and seed the generator 
std::normal_distribution<> d(mean, deviation); // Create distribution 
std::cout << d(gen) << std::endl; // Generate random numbers according to distribution 

注意std::mt19937std::mersenne_twister_engine一個typedef

+0

std :: mt19937'是typedef for a特殊的'std :: mersenne_twister'模板實例化。 'std :: mt19937'是一個經過驗證的僞隨機數發生器。模板可以用產生不太好的引擎的值來實例化,所以大多數人應該堅持'std :: mt19937'。 – 2013-02-19 23:50:50

1

<random>的標準庫的整點是從隨機數生成器,以獨立分佈。 You提供了一個生成統一整數的隨機數生成器,並且分佈負責將該隨機統一整數序列轉換爲期望分佈的樣本。

幸運的是,<random>庫還包含一個隨機數生成器的集合。 Mersenne Twister(std::mt19937)尤其是一個相對較好的(即快速和統計學上的高質量)。

(您還需要提供用於發生器的種子

0

我知道這個帖子很老,但是,我希望我的回答是有益的。我使用normal_distribution爲傳感器生成高斯噪聲。這對模擬傳感器是有益的。例如,假設您有一個傳感器,可以爲您提供2D機器人的位置。每次移動機器人時,傳感器都會提供一些關於機器人位置的信息。在OpenGL中,你可以模擬這個例子。例如,您可以跟蹤鼠標的位置,並將一些高斯噪聲添加到鼠標的實際位置。在這種情況下,您可以使用傳感器來跟蹤鼠標的位置,但由於噪音而具有不確定性。