C++随机数
C中的做法
- 之前都是使用rand()函数进行无符号随机整数的生成,如果需要生成对应的范围或者浮点数,需要自己进行一些修改,unsigned随机数生成的方法如下所示。在使用中,为了使得每次运行的结果都不一样,我们将当前时间对应的无符号数作为初始化的种子。
code
void randOld() { // 按照时间来初始化种子,保证每次结果不一样 srand((int)time(0)); for (int i = 0; i < 10; i++) cout << rand() << ", "; cout << endl; }
新标准的做法
- 新标准中在头文件
<random>
中引入了许多分布类型,下面做一下简要介绍。 random_device
:非确定性随机数生成设备,可以用于生成随机初始化的种子,保证每次的运行结果都不一样default_random_engine
:生成随机无符号数uniform_int_distribution
:生成某个范围内的均匀随机分布的数,模板类,包含提供参数的上下限。uniform_real_distribution
:均匀随机分布的实数分布生成器normal_distribution
:正态分布- 更多的可以参考:http://www.cplusplus.com/reference/random/
code
void randNew() { random_device rd; // 非确定性随机数生成设备 default_random_engine e1; // 使用默认的初始化种子 default_random_engine e2(rd()); // 不确定的数作为初始化种子,每次运行结果都不一样 for (int i = 0; i < 10; ++i) cout << e1() << " "; cout << endl; for (int i = 0; i < 10; ++i) cout << e2() << " "; cout << endl; // 整数范围 uniform_int_distribution<> uid(-1, 1); // 包含上下限 for (int i = 0; i < 10; i++) cout << uid(e2) << " "; cout << endl; // 实数范围 uniform_real_distribution<> udouble(-1, 0); for (int i = 0; i < 10; i++) cout << udouble(e2) << " "; cout << endl; normal_distribution<> normal(0, 2); for (int i = 0; i < 10; i++) cout << normal(e2) << " "; cout << endl; lognormal_distribution<double> lognormal(0, 1); for (int i = 0; i < 10; i++) cout << lognormal(e2) << " "; cout << endl; }