半随机数生成C ++

时间:2018-10-25 20:58:58

标签: c++ loops random

我正在运行蒙特卡洛模拟,其中生成了100,000条随机路径。我的问题是我想找到一种方法将这些相同的100,000条随机路径保留在其他变量的循环中。本质上,每次运行100,000次迭代时,我都希望重置随机数生成器。目前,我的代码看起来像这样:

 vector<double>Rand_Var(double time)
 {
    static mt19937 generator;

    normal_distribution<>ND(0., 1.);
    ND(generator);
    double phi;
    vector<double> rand(time + 1);
    for (int i = 1; i <= time; i++)
    {
      phi = ND(generator);
      rand[i] = phi;        
    }

    return rand;
}

然后在main()中进行测试,我有

for (int l = 0; l < 5; l++)
{   
    for (int i = 0; i <= 1; i++)
    {   
        vector<double>rand_val = Rand_Var(time_opt);            
        cout << rand_val[4] << endl;
    }
}

我得到以下输出:

-0.214253
 1.25608
-1.82735
 0.919376
 1.45366
-0.791957
 0.530696
 0.0751259
-0.559636
-0.709074

但是我想要得到的是这样的:

-0.214253
 1.25608
-0.214253
 1.25608
-0.214253
 1.25608
-0.214253
 1.25608
-0.214253
 1.25608

这可能吗?

3 个答案:

答案 0 :(得分:2)

如果您想再次获得同一组随机数,只需reseed your generator到同一种子!

例如:

vector<double>Rand_Var(double time, bool should_reset) {
    static time_t my_seed = time(0);
    static mt19937 generator(my_seed);
    if(should_reset) { generator.seed(my_seed); } //reseed and reset!

    ...

然后在您的循环中:

for (...){
    bool should_reset = true;

    for (...) {
        vector<double>rand_val = Rand_Var(time_opt, should_reset);
        should_reset = false;
        ...
    }
}

答案 1 :(得分:0)

如果使用静态变量,则它将被初始化一次并始终生成新的数字。

只需删除静态函数,它将在每次调用该函数时进行初始化并使用相同的种子。

如果您需要多个数字(尚不清楚现在几点钟,是随机性的索引还是数值?),请将rng用作参数:

vector<double>Rand_Var(mt19937& rng, double time);

并在第一个for循环中创建一个新的

for (int l = 0; l < 5; l++)
{
    mt19937 generator;
    for (int i = 0; i <= 1; i++)
    {
        auto rand_val = Rand_Var(generator , time_opt);

答案 2 :(得分:0)

如果希望每100,000个随机数相同,则将生成器包装在一个函数中并保留一个计数器。那会给你一个像这样的随机函数

double random()
{
    static std::mt19937 generator;
    static int counter = 0;
    if (counter % 100000 == 0) // reset every 100000 times.
        generator.seed();
    normal_distribution<> dis(0., 1.);
    counter++;
    return dis(generator);
}

如果您希望每10万次致电Rand_Var的电话始终返回,那么您只需要做同样的事情

std::vector<double> Rand_Var(std::size_t time)
{
    static std::mt19937 generator;
    static int counter = 0;
    if (counter % 100000 == 0) // reset every 100000 times.
        generator.seed();
    normal_distribution<> dis(0., 1.);
    counter++;
    std::vector<double> data;
    data.reserve(time);
    std::generate_n(std::back_inserter(data), time, [&](){ return dis(generator); });       
    return data;
}