一直觉得C++随机数对日常的编程来说就像这句话 “食之无味,弃之可惜” ,还是花一点时间仔细了解一下吧。
前世:
C++11标准出现前,无论c和都用下面的方法产生随机数。
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
for(int i=0;i<10;i++)
cout << rand() << endl;
}
但是如果你关闭该程序并再次运行的话你会发现输出结果还是这十个同样的数,一般会引入srand()解决。
#include <iostream>
#include <stdlib.h>
#include<time.h>
using namespace std;
int main()
{
srand(time(0));
for(int i=0;i<10;i++)
cout << rand() << endl;
}
time(0)的返回的是从1970 UTC Jan 1 00:00到当前时刻的秒数,为unsigned int类型。当我们在不同时刻运行程序时,srand(time(0))会设置不同的随机数种子,因此就可以得到不同的结果。注意的是,如果在一秒内执行两次上面的程序输出的结果也是相同的,仔细想想为什么。
#include <iostream>
#include <stdlib.h>
#include<time.h>
using namespace std;
int main()
{
srand(time(0));
for(int i=0;i<10;i++)
cout << rand() << endl;
cout <<" ***************** "<< endl;
srand(time(0));
for (int i = 0; i < 10; i++)
cout << rand() << endl;
}
输出:
可以在两次生成随机数之间插入sleep(1)来手动延时,保证随机数种子不同。
简单介绍rand():
此函数生成均匀分布的伪随机数(线性同余法),每个随机数的范围在0和一个系统相关最大值之间。但是,对于大多数使用随机数的程序来说,它们需要不同范围的随机数,一些应用需要浮点随机数,一些程序需要均匀随机数,为了解决这些问题,我们试图转换rand生成随机数的范围、类型或分布时,常常会引入非随机性。
今生:
C++11引入了随机数引擎与随机数分布类的概念,感觉高大上起来了。
头文件:#include<random>
#include <iostream>
#include<random>
#include<time.h>
using namespace std;
随机数引擎:
void test_default_random_engine()
{
default_random_engine e;
e.seed(time(0));
for (int i = 0; i < 10; i++)
cout << e() << endl;
}
随机数分布类:
1.生成0~9的无符号整数
void test_uniform_int_distribution()
{
uniform_int_distribution<unsigned> u(0, 9);
default_random_engine e;
e.seed(time(0));
for (int i = 0; i < 10; i++)
cout << u(e) << ends;
}
2.生成0~1随机浮点数
void test_uniform_real_distribution()
{
uniform_real_distribution<double> u(0, 1);
default_random_engine e;
e.seed(time(0));
for (int i = 0; i < 10; i++)
cout << u(e) << ends;
}
3.生成正态分布随机数
void test_normal_distribution()
{
default_random_engine e;
e.seed(time(0));
normal_distribution<> n(4, 1.5);//均差4,标准差1.5 默认生成浮点数
for (int i = 0; i < 10; i++)
cout << n(e) << ends;
}