我需要在具有均匀分布的循环中生成两个指定数字之间的随机数。我正在使用C ++ 11的random
库。
我的问题是我在循环中不断获得相同的数字。要求每次循环传递时生成的数字不同。代码如下:
#include <cstdlib>
#include <stdio.h>
#include <iostream>
#include <random>
using namespace std;
double randnum (double a, double b)
{
std::default_random_engine generator;
std::uniform_real_distribution<double> distribution (a,b);
double num=distribution(generator);
return num;
}
int main()
{
int np=100;
double umin =0;
double umax=0.5;
double u[np];
for (int i=0;i<np;i++)
{
u[i]=randnum(umin,umax);
cout<<u[i]<<endl;
}
}
请帮忙。任何以其他方式产生随机数的建议都是受欢迎的,但必须有统一的分布。
答案 0 :(得分:5)
标准库中的随机数引擎是伪随机,即确定其内部状态的初始化和变异方式。这意味着每个函数调用将获得一个新的新生成器,它将继续一遍又一遍地给出相同的数字。
只需设置generator
一个static
函数变量,使其状态可以通过不同的函数调用进行演变。
#include <iostream>
#include <random>
using namespace std;
double randnum (double a, double b)
{
static std::default_random_engine generator;
std::uniform_real_distribution<double> distribution (a,b);
return distribution(generator);
}
int main()
{
const int np=100;
double umin =0;
double umax=0.5;
double u[np];
for (int i=0;i<np;i++)
{
u[i]=randnum(umin,umax);
cout<<u[i]<<endl;
}
}
<强> Live Example 强>
注意,对于编译程序的每次运行,您将获得相同的数字序列。要在程序调用中获得更多随机行为,您可以使用例如std::random_device
。
答案 1 :(得分:1)
想要加入第一个答案: 使用静态函数会在循环中生成不同的数字,但会在每次运行时生成相同的随机数集。我通过使用时间作为种子来避免这种情况:
#include <iostream>
#include <random>
#include <chrono>
using namespace std;
double randnum (double a, double b)
{
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
static std::default_random_engine generator (seed);
//static std::default_random_engine generator;
std::uniform_real_distribution<double> distribution (a,b);
return distribution(generator);
}
int main()
{
const int np=100;
double umin =0;
double umax=0.5;
double u[np];
for (int i=0;i<np;i++)
{
u[i]=randnum(umin,umax);
cout<<u[i]<<endl;
}
}