簡體   English   中英

C++ 中的隨機數:一個引擎,多個分布 -> 意外行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM