簡體   English   中英

C ++在函數中生成隨機數

[英]C++ Generating random numbers in functions

對於我正在從事的項目,我需要在函數中生成隨機數向量。 問題是我最終每次都會生成相同的數字向量。 我有這個例子重現了我的問題:

#include <iostream>
#include <random>

std::vector<double> generate(std::default_random_engine generator, double mean, double sigma, int n)
{
    std::vector<double> generated(n,0);
    std::normal_distribution<double> distribution(mean,sigma);
    for (int i = 0;i<n;i++)
        generated[i] = distribution(generator);
    return generated;
}
std::vector<double> generate(double mean, double sigma, int n)
{
    std::vector<double> generated(n,0);
    std::default_random_engine generator;
    std::normal_distribution<double> distribution(mean,sigma);
    for (int i = 0;i<n;i++)
        generated[i] = distribution(generator);
    return generated;
}

int main(int argc, char** argv)
{
    // Read inputs
    int nrolls = 20;  // number of experiments
    int ntimes = 50;
    double mean = 100;
    double sigma = 4;
    bool useFunction(false);
    if (argc>1)
        useFunction=true;

    // crates series
    std::vector< std::vector<double> > results(ntimes,std::vector<double>());
    std::default_random_engine generator;
    for (int i = 0;i<ntimes/4;i++){
        std::vector<double> generated(nrolls,0);
        std::normal_distribution<double> distribution(mean,sigma);
        for (int i = 0;i<nrolls;i++)
            generated[i] = distribution(generator);
        results[i] = generated;
    }
    for (int i = ntimes/4;i<ntimes/2;i++)
        results[i] = generate(generator,mean,sigma,nrolls);
    for (int i = ntimes/2;i<3*ntimes/4;i++){
        std::vector<double> generated(nrolls,0);
        std::normal_distribution<double> distribution(mean,sigma);
        for (int i = 0;i<nrolls;i++)
            generated[i] = distribution(generator);
        results[i] = generated;
    }
    for (int i = 3*ntimes/4;i<ntimes;i++)
        results[i] = generate(mean,sigma,nrolls);
     //

    // Display all random numbers
    for (int i = 0;i<ntimes;i++){
        std::cout<<i;
        for (int j = 0;j<nrolls;j++)
            std::cout<<" "<<results[i][j];
        std::cout<<std::endl;
    }

    // Check number of equal results
    int n_equal(0);
    int n_total(0);
    for (int i=0;i<ntimes;i++){
        for (int k = 0;k<nrolls;k++){
            for (int j=i+1;j<ntimes;j++){
                n_total++;
                if (results[i][k] == results[j][k])
                    n_equal++;
            }
        }
    }
    std::cout<<n_equal<<"/"<<n_total<<std::endl;

    // Exit
    return 0;
}

我試圖通過將生成器傳遞給生成隨機數數組的函數來解決此問題,但顯然,它也不起作用。 有人可以提示我每次調用generate函數時如何獲取不同的數組嗎?

非常感謝你。

您在這里有兩個問題。 第一

std::vector<double> generate(std::default_random_engine generator, double mean, double sigma, int n)

按值獲取PRNG ,這意味着將進行復制。 這意味着每次調用該函數都將以相同的順序開始,因為您從未從調用站點修改過生成器。

第二個問題是

std::vector<double> generate(double mean, double sigma, int n)

每次調用該函數時,都將重新創建相同的生成器。 這將不起作用,因為每次都會創建相同的序列。

通常,您有兩個選擇。 您可以通過引用將PRNG傳遞給函數,也可以在函數中聲明static PRNG,以使其在函數調用之間持久存在。

與他們玩了一會之后,我發現最好將全局變量用於新的C ++隨機生成器。 每個隨機數套件都應該有一個,因此(統計上幾乎是:)您100%一定要指定分配。

偽隨機生成器本質上是靜態的野獸,因為它們保留在上一次計算中生成的數字以生成下一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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