我正在运行蒙特卡洛模拟,其中生成了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
这可能吗?
答案 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;
}