C标准库中srand()和rand()关于随机数的记录
首先需要说明,C标准库可以在C++中使用。srand()和rand()均来源于<cstdlib>中。因为这两个函数只能生成相对随机的伪随机数(有规律的随机数),这种不能直接实现“绝对随机”的函数一开始会给大家带来一些疑惑。下面记录了一些关于srand()和rand()的使用方法,以及如何实现伪随机数的“绝对随机”。
一、srand()和rand()函数
1、srand()
void srand(unsigned seed);
srand(seed)函数是rand()函数的种子,用于初始化rand()函数的初始值。
2、rand()
int rand(void); // 指定从seed开始,返回一个[seed, RAND_MAX(0x7fff)]的随机整数
情况1
调用rand()函数时,若没有在之前调用srand(seed)函数,系统会自动将seed默认为1,执行srand(1)函数,从而返回一个[1, RAND_MAX(0x7fff)]的随机整数。
情况2
调用rand()函数时,若在之前调用了srand(seed)函数,则会返回一个[seed, RAND_MAX(0x7fff)]的随机整数。
二、经典案例
在[0, 6)区间随机取得一个整数
1、未使用srand(unsigned seed)函数指定seed值
const int cnt = 6;
for(int i=0; i<10; i++)
{
cout << "TRY_" << i+1 << ": " << rand() % cnt << endl;
}
TRY_1: 1
TRY_2: 1
TRY_3: 5
TRY_4: 2
TRY_5: 4
TRY_6: 2
TRY_7: 0
TRY_8: 2
TRY_9: 5
TRY_10: 1
默认seed=1,每次执行都输出同样的结果。
2、使用了srand(unsigned seed)函数指定seed=1
const int cnt = 6;
srand(1); // 这里添加了seed=1
for(int i=0; i<10; i++)
{
cout << "TRY_" << i+1 << ": " << rand() % cnt << endl;
}
TRY_1: 1
TRY_2: 1
TRY_3: 5
TRY_4: 2
TRY_5: 4
TRY_6: 2
TRY_7: 0
TRY_8: 2
TRY_9: 5
TRY_10: 1
通过srand(1)设定seed的初始值为1,每次执行都输出同样的结果,且与案例1结果相同。
这里也从侧面验证了案例一中,若不调用srand(unsigned seed),系统就会调用srand(1)函数的事实。
3、使用了srand(unsigned seed)函数指定seed为3
const int cnt = 6;
srand(3); // 这里添加了seed=3
for(int i=0; i<10; i++)
{
cout << "TRY_" << i+1 << ": " << rand() % cnt << endl;
}
TRY_1: 3
TRY_2: 3
TRY_3: 1
TRY_4: 5
TRY_5: 5
TRY_6: 0
TRY_7: 0
TRY_8: 4
TRY_9: 1
TRY_10: 1
虽然和前两个案例结果不同,但每次运行结果相同。
4、实现“完全随机”案例
#include <ctime>
const int cnt = 6;
srand((unsigned)time(0));
for(int i=0; i<10; i++){
cout << "TRY_" << i+1 << ": " << rand() % cnt << endl;
}
这里引入了<ctime>,将seed值指定为当前流逝的时间。因为时间是不停变化的,所以每次运行时,我们所得到的seed值都在改变,从而导致每次获取的结果均不相同。
第一次运行
TRY_1: 4
TRY_2: 4
TRY_3: 4
TRY_4: 0
TRY_5: 5
TRY_6: 4
TRY_7: 0
TRY_8: 1
TRY_9: 1
TRY_10: 4
第二次运行
TRY_1: 4
TRY_2: 5
TRY_3: 1
TRY_4: 5
TRY_5: 2
TRY_6: 4
TRY_7: 1
TRY_8: 1
TRY_9: 1
TRY_10: 3
第三次运行
TRY_1: 4
TRY_2: 0
TRY_3: 3
TRY_4: 3
TRY_5: 5
TRY_6: 4
TRY_7: 3
TRY_8: 4
TRY_9: 4
TRY_10: 2
第n次运行...
TRY_1: 0
TRY_2: 4
TRY_3: 1
TRY_4: 4
TRY_5: 2
TRY_6: 1
TRY_7: 2
TRY_8: 4
TRY_9: 4
TRY_10: 5
5、关于取随机数这件事
在[a,b)区间中随机取得一个整数,公式为:
(rand() % (b-a)) + a; // 左闭右开