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% 确保获得指定的分布。
伪随机生成器本质上是静态的野兽,因为它们保留在上次计算中生成的数字以生成下一次计算。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- 随机数生成函数说明
- C++随机数分布传递给函数
- 每次调用函数时,随机数都相同
- 创建整数的 2D 数组,该数组将使用两个函数用随机数填充矩阵.我做错了什么?
- 我需要线程函数在不停止实际程序的情况下,每2秒打印一次随机数
- C++ 在函数中生成随机数
- 用于创建高斯随机数的 c++ 函数
- C++11 中的随机数:有没有一种简单的方法可以将生成器种子放在代码的一个位置,然后在不同的函数中使用它?
- 为什么这4个不同的随机数生成器函数会产生相同的一系列数字
- 是否有在 c++ 中使用三角分布生成随机数的函数
- 将范围随机数保存到数组而不重复的函数
- 传递参数、参数、交换函数和随机数生成器
- 随机数函数未正确随机化 (C++)
- c++11 子函数中的随机数生成器
- rand()在通过函数调用时生成相同的随机数集(即使在使用srand(time(NULL)进行种子设定之后)
- 函数用于随机数(C++11)
- 提升C++:在函数中播种随机数
- C++循环中调用伪随机数生成器函数 - 常量种子问题