rand()和srand() 函数大家一定很熟悉,用法见博客:随机数与随机种子
rand()我们最简单的用法是这样的:
//ubuntu 14.04
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main(){
int a = 0;
srand((int)time(NULL));
for(int i = 0; i < 5; i++){
a = rand();
cout << a << ' ';
}
return 0;
}
输出为:
有时候我们需要多次调用rand()函数的时候,一定记得只需要设置一次随机数种子就好了,假如说rand()函数需要在子函数内使用,绝对不要把srand()写在子函数内,例如:
//ubuntu 14.04
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void abc(){
int a = 0;
srand((int)time(0)); //注意随机数种子的这个位置;
for(int i = 0; i < 5; i++){
a = rand();
cout << a << ' ';
}
cout << endl;
}
int main(){
for(int i = 0; i < 5; i++){
abc();
}
return 0;
}
你猜输出会是什么?
我去!竟然五次调用abc()函数产生的随机数都一样?这是因为每一次进入abc函数,都会重新设置一次随机数种子,但是程序执行的速度又是很快的,快到五次执行abc()函数的时间几乎是一样的,所以这五次设置的随机数种子就变成一样的,那么输出是一样的,就不足为奇了。
那么这种情况下,正确的做法应该是将随机数种子写在main函数的开头,这样;
//ubuntu 14.04
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void abc(){
int a = 0;
for(int i = 0; i < 5; i++){
a = rand();
cout << a << ' ';
}
cout << endl;
}
int main(){
srand((int)time(0)); //随机数种子应该写在这儿
for(int i = 0; i < 5; i++){
abc();
}
return 0;
}
输出为:
过程糟心记录:
1、写测试小程序的时候,是以.cpp结尾的,然后编译的时候我顺手使用的命令是:gcc XXX.cpp,疯狂报错:undefined reference to `std::cout'。。。等等。。。
我查了查,这么短的代码,没错啊,实在找不到原因,上网查了下,发现应该使用g++编译器。至于为什么?其实之前的博客就写过:gcc和g++的关系,啪啪啪好打脸。
2、扩展思考:
如果想在C++ 类的不同成员函数里分别产生的两组不同的随机数,这个时候随机数种子可以撒在构造函数里面。千万不要在具体的函数里面撒,如果在两个成员函数中分别撒随机数种子,和没撒是一样一样的。因为程序的运行时间快,这样的话srand()都设置成同一个时间了,