目录
- 引言
- 1、C++98标准实现随机数
- 2、C++11新标准随机数引擎
引言
在C++11出现之前,C++98使用随机数采用的是C标准库的写法。而在C++11出现后,我们生成随机数可以采用更为现代化的方式。
1、C++98标准实现随机数
以往生成随机数使用的是cstdlib.h
库中的rand()函数,由于我们需要根据不同时间生成不同的随机数,因此还需要引入ctime.h
库。需要注意的是这里实现的都是伪随机数
。
rand()的最大值和声明的变量有关,若为16位编译器,则int 为 16位,含有2字节。去掉一个符号位,最大值是2^15-1=32767。
默认随机数种子是0,因此如果采用默认方法时,每次生成的随机数是一致的,这时便于应用程序的调试。
#include<cstdlib.h>
#include<ctime.h>
float Rand = rand(); //每次产生一样的随机数
每次产生不同的随机数引入ctime.h:
#include<cstdlib.h>
#include<ctime.h>
srand((int) time(0));
float Rand = rand(); //每一时刻产生的随机数不相同
需要产生某一范围内的随机数:
rand()%(b-a) + a
来产生[a,b)内的数值。
比如[0,100)则可以使用
rand() % 100
公式rand()%(b-a)
,是求范围随机数的计算公式,%是做求余运算,正整数对n求余的范围肯定是在0~n-1之间,也就是rand()%(b-a)的范围是0~b-a-1,然后加上a,也就是范围变成了a~b-1。
rand()%90+10=rand()%(100-10)+10
需要浮点型数在0~1内,使用
rand()/(double)RAND_MAX;
2、C++11新标准随机数引擎
因为之前C、C++依赖的C标准库rand()方法存在问题,C++11引入了新的随机数库random.h。
它可以通过随机数引擎类(random_number_engines)生成随机数序列,也可以通过随机数分布类(random-number distribution)使用随机数引擎生成 服从特地概率分布的随机数。这里的随机数引擎是函数对象
,所以需要调用才能生成随机数。
#include <iostream>
#include <random>
using namespace std;
int main()
{
default_random_engine e;
cout << e() << endl;
cout << e.min() << endl;
cout << e.max() << endl;
}
声明随机数类后会达到像上面rand()一样的效果,也是一个保持不变的随机数。
可以看到范围大小为0~4294967295。生成的是不带符号的32位整数。
若生成不同的随机数:
#include <iostream>
#include <random>
using namespace std;
int main()
{
default_random_engine e(10);
for (auto t = 0;t < 3;t++)
{
cout << e() << endl;
}
cout << e.min() << endl;
cout << e.max() << endl;
}
每次调用e()都会生成不同的随机数。
设置范围相比rand()要使用数学方法计算简单很多,声明一个随机数分布类,然后将随机数引擎作为参数传递。
#include <iostream>
#include <random>
using namespace std;
int main()
{
default_random_engine e(10);
uniform_int_distribution<unsigned> u(0, 9); //随机数分布对象
for (auto t = 0;t < 3;t++)
{
cout << u(e) << endl;
}
cout << e.min() << endl;
cout << e.max() << endl;
}
如果要生成小数的话,只需要修改随机数分布类uniform_int_distribution<unsigned>
为uniform_real_distribution<double>
:
#include <iostream>
#include <random>
using namespace std;
int main()
{
default_random_engine e(10);
uniform_real_distribution<double> u(0, 9); //随机数分布对象
for (auto t = 0;t < 3;t++)
{
cout << u(e) << endl;
}
cout << e.min() << endl;
cout << e.max() << endl;
}
同时还有正态分布类normal_distribution<>
,感兴趣大家可以自行了解,这里就不叙述了。