[英]Why use variate_generator when I can just pass the RNG to the distribution? (C++ and Boost, specifically)
我為什么要做這樣的事情:
#include <boost/random.hpp>
#include <ctime>
using namespace boost;
double SampleNormal (double mean, double sigma)
{
static mt19937 rng(static_cast<unsigned> (std::time(0)));
normal_distribution<double> norm_dist(mean, sigma);
variate_generator<mt19937&, normal_distribution<double> > normal_sampler(rng, norm_dist);
return normal_sampler();
}
在我看來,代碼如下:
#include <boost/random.hpp>
#include <ctime>
using namespace boost;
double SampleNormal (double mean, double sigma)
{
static mt19937 rng(static_cast<unsigned> (std::time(0)));
normal_distribution<double> norm_dist(mean, sigma);
return norm_dist(rng);
}
應該也一樣。
為什么要使用variate_generator? 它做的事情比第二個示例還要多嗎?
有一點背景知識:我正在運行100個模擬實例,其中涉及一個隨機過程發生的循環的10 ^ 7次迭代。 這意味着我需要非常好的隨機數。
無需使用variate_generator
並且兩個代碼示例都可以。
variate_generator只是為了方便起見,因此您不需要每次需要一個新數字時都使用rng
參數調用norm_dist(rng)
。
如果構造variate_generator<mt19937&, normal_distribution<double> > normal_distr_rnd_num
,則每次要獲取新數字時都可以調用normal_distr_rnd_num()
。 在某些情況下,這可能會使代碼更具可讀性。
我不確定您要如何使用SampleNormal(double mean, double sigma)
函數。 如果你與非常相同的值調用該函數很多時候(mean,sigma)
它可能是值得構建這樣一個variate_generator對象-我們稱之為sample_normal
-然后只需調用sample_normal()
而不是你的函數。
關於數字質量的評論:
數字的質量主要取決於基礎的偽隨機數算法,即您選擇的生成器。 mt19337的周期為2 ^ 19937-1,足以滿足10 ^ 7 = 2 ^ 24(大約)個數字,並且兩個連續數字之間沒有“明顯的”相關性。 但是,數字仍然是由單個確定性算法生成的。 您的應用程序可能只是證明這種確定性的測試,盡管可能性不大。 因此,您還可以更改偽隨機數生成器,以查看您的應用程序是否以完全不同的生成偽隨機數的方式給出相同的結果。
我更關心生成器的初始化(種子)。 如果您運行100個實例,則很可能並行執行此操作。 現在,如果並行運行其中一些實例,則可能同時啟動兩個實例。 由於您使用time()
初始化了生成器,因此這兩個實例將以相同的數字作為種子。 因此,兩個實例將使用完全相同的隨機數序列。
在科學應用中,優良作法是手動播種隨機數生成器(以確保使用不同的種子進行初始化)或至少記錄/記錄使用的種子。 這樣,您就可以再現偽隨機數的序列,從而再現程序的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.