C++随机数
C++提供了两个函数,用于返回随机数:rand() 和 srand()
rand()
功能: 随机数发生器
用法:
// #include<stdlib.h>
int rand(void)
rand()的内部实现是用线性同余法做的,简单的讲就是通过类似于一个数学周期函数去生成一个数字。而这个周期又特别的长,所以在一定范围内可以看成是随机的。故单独使用rand()生成的随机数实际上是伪随机数。
当用户未设定随机数种子时,系统会默认随机数种子为1。随机数种子可以简单地理解成上面提到的数学周期函数的参数。
因为rand() 产生的是伪随机数字,每次执行时是相同的“周期函数”; 若要不同, 可以用函数 srand() 初始化它。换个简单的理解方式:srand()就是给“周期函数”添加了一个参数。
srand()
功能:
初始化随机数发生器
用法:
// #include<stdlib.h>
void srand(unsigned int seed)
/*
unsigned:无符号
表示抛弃数据类型的负数部分,将更多的存储空间用来存放非负数
例如:int类型原本占用4字节空间,即只能存储[-2^31,2^31 - 1]范围内的数据
加unsigned后存储数据的范围就是[0,2^32 - 1]
unsigned int表示[0,2^32 - 1]范围内的整型
*/
srand() 用来设置 rand() 产生随机数时的随机数种子。参数 seed 必须是个整数,如果每次 seed 都设相同值,rand() 所产生的随机数值每次就会一样。所以想要生成指定数量的随机数,就需要在每次使用rand()都使用srand()重新产生一个随机数种子。
使用time()作为随机数种子
功能:
时间戳,返回从1970年1月1月零点零分零秒到当前时间的秒数
用法:
// #include<time.h>
time_t time(time_t * t); // 指针t用于存放返回的时间,可以传空指针
我们可以将time返回的时间作为参数传递给srand(),因为程序每一次运行时,我们的时间都是不一样的,即每次运行时的随机数种子都不一样。
srand((unsigned)time(NULL));
rand();
随机数范围计算
首先我们可以通过rand() % n的方式,获取到[0,n)的随机数,因为任何一个数除以n得到的余数0到n-1。那么我们就可以通过改变n的值就可以去指定截止数,再将取到的范围加上一个值就可以改变起始数:
要取得 [a,b) 的随机整数,使用 (rand () % (b-a))+ a;
要取得 [a,b] 的随机整数,使用 (rand () % (b-a+1))+ a;
要取得 (a,b] 的随机整数,使用 (rand () % (b-a))+ a + 1;
要取得 0~1 之间的浮点数,可以使用 rand () /double (RAND_MAX)。
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main() {
// 生成随机数种子
srand((unsigned)time(NULL));
// RAND_MAX 是 rand() 函数能够产生的最大随机数
cout << "RAND_MAX:" << RAND_MAX << endl;
int a = 1, b = 10;
// 生成[a,b)的随机数
cout << (rand() % (b-a)) + a << endl;
// 生成[a,b]的随机数
cout << (rand() % (b-a+1)) + a << endl;
// 产生(a, b] 的随机数,可以使用(rand() % (b - a)) + a + 1;
cout << (rand() % (b - a)) + a + 1 << endl;
// 产生[0, 1] 的浮点数,可以使用 rand() / double(RAND_MAX);
cout << rand() / double(RAND_MAX) << endl;
return 0;
}