本文献给亲爱的猪小哼同学。
在C++ 中,rand() 会产生一个随机值,而srand() 是为rand() 函数设置随机数种子。
什么是随机数种子?我们可以把随机数种子是个随机数盒子的标签, 如果这个种子(标签)相同,随机数盒子里的数都是相同的。
如果我们不设置这个种子,系统缺省会认为这个种子是 1 。如果种子相同,取出的随机数相同,例如:
#include<iostream>
#include <stdlib.h>
using namespace std;
int main()
{
srand(10);
for(int i = 0; i < 10; i++)
{
cout << rand() << endl;
}
return 0;
}
我们运行两遍:
可以发现,虽然每次RAND 返回的值可能不同, 只要相同的种子,每次程序运行返回的数据集合是相同的。
所以,为了程序每次运行返回不同的随机数,种子最好每次不一样。
如何使每次的种子都不一样,而且这值是整数? 时间,从1970年1月1日到当前的时间的秒数,每次都是变化的,拿这个做种子,最合适了,这个时间就是time(0)。
#include<iostream>
#include <stdlib.h>
using namespace std;
int main()
{
srand((unsigned)time( 0 ));
for(int i = 0; i < 10; i++)
{
cout << rand() << endl;
}
return 0;
}
运行两遍:
如果我们把srand((unsigned)time( 0 )); 放在循环里:
#include<iostream>
#include <stdlib.h>
using namespace std;
int main()
{
for(int i = 0; i < 10; i++)
{
srand((unsigned)time( 0 ));
cout << rand() << endl;
}
return 0;
}
你发现,还不是两次运行结果一样,即使同一次每次RAND 取值也一样
这是因为time(0) 返回的是秒数,如果CPU运行太快,每次取得的time(0) 值是相同的。 而且每次都是先置种子,就取值,相当于每次都从相同标签的随机盒子里取第一个。
我们可以模拟一下延迟1秒,使得每次time(0) 返回值不一样
#include<iostream>
#include <stdlib.h>
#include <unistd.h>
//#include <windows.h>
using namespace std;
int main()
{
for(int i = 0; i < 10; i++)
{
srand((unsigned)time( 0 ));
cout << rand() << endl;
sleep(1.0);
}
return 0;
}
sleep 函数,在linux 下使用#include <unistd.h> ,windows 下使用#include <windows.h>
运行: