[英]Random numbers in C++: one engine, multiple distributions -> unexpected behaviour
我正在使用 C++14。 我想使用隨機引擎生成一個隨機數 stream,並從這個 stream 中抽取來自不同分布的隨機變量。 但是,我發現分布之間似乎存在一些相互作用,這會導致意外行為。 這是我的代碼(在 MS Visual Studio 2019 中使用默認編譯器設置編譯)。
#include <random>
#include <iostream>
#include <vector>
int main()
{
double alpha;
std::cin >> alpha;
std::default_random_engine generator;
generator.seed(1);
std::normal_distribution<> distNorm(0., 1.);
std::gamma_distribution<> distGam(alpha, 1.);
std::vector<double> normal;
std::vector<double> gamma;
for(size_t idxBatch = 0; idxBatch < 2; ++idxBatch)
{
for(size_t i = 0; i < 2; ++i)
normal.push_back(distNorm(generator));
for(size_t i = 0; i < 1; ++i)
gamma.push_back(distGam(generator));
}
for(size_t i = 0; i < normal.size(); ++i)
std::cout << normal[i] << std::endl;
std::cout << std::endl;
for(size_t i = 0; i < gamma.size(); ++i)
std::cout << gamma[i] << std::endl;
return 0;
}
使用 alpha = 1 運行代碼會產生:
-1.40287
-0.549746
0.188437
0.483496
0.490877
1.87282
使用 alpha = 2 運行代碼會產生:
-1.40287
-0.549746
-1.95939
0.257594
1.34784
2.28468
換句話說,正態分布的 output 受到伽馬分布參數的影響(第一個塊中的第 3 和第 4 項)。 這是不希望的。 正態分布對於伽馬分布的參數化應該是不變的
有誰知道我做錯了什么?
該引擎是隨機位的 stream 的來源。 分發消耗這些位並將它們轉換為數字。 對於生成的每個數字,分布可能會消耗更多或更少的位(例如,如果它使用拒絕采樣)。 這就解釋了為什么一個發行版的 output 會受到另一個發行版的影響。
如果您希望發行版的 output 是獨立的,您應該使用兩個獨立的引擎。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.