C++杂谈(三)产生随机数与time函数
产生随机数在程序中很有用,这篇文章简单介绍一下产生随机数的方法。
伪随机数
使用标准库<cstdlib>中的rand()函数产生随机数。
#include<iostream> #include<cstdlib> using namespace std; int main() { for (int i = 0; i < 3; i++) cout << rand()%10 << endl;//pesudo radom return 0; }
表面上看,这段程序会产生三个随机数,但一个有趣的事情是,每次程序运行时产生的数据都是相同的。
我每次运行的结果都如下:
可以看出,rand()函数并不会产生一个真正的随机数。
要产生真正的随机数,需要了解time函数。
time函数
<ctime>中的time函数可以返回一个时间。函数声明如下
time_t time( time_t *timer );
参数timer是一个指针,指向时间的存储位置。使用时参数可以为0。如果使用其他整数,比如1,会产生无法从int转换成timme_t的错误。
#include<iostream> #include<ctime> using namespace std; int main() { cout << time(0)<<endl; return 0; }
对于time函数的返回值,一把理解应该是当前的时间,但事实运行结果却并不如所想。
事实上,这个结果便是当前时间,只是表示方法有所不同。这个值是从1970年1月1日午夜到现在的秒数。
真正的随机数
<cstdlib>中产生用于真正随机数的函数srand()。函数接受一个参数作为seed,用于控制rand()函数的算法。相同的seed会使rand()产生相同的结果。
所以,若要产生真正的随机数,可以使用时间作为seed,这样每次都会产生真正的随机数了。
#include<iostream> #include<cstdlib> #include<ctime> using namespace std; int main() { srand(time(0)); for (int i = 0; i < 3; i++) cout << rand() << endl;//truly random return 0; }
这样,在使用了stan()之后,rand便可产生真正的随机数了。
控制随机数的范围
可以使用模运算来控制随机数的范围。下面代码产生了[0,10)范围的随机数。
rand()%10;
一个例子,展示了这篇文章提及的函数。
#include<iostream> #include<cstdlib> #include<ctime> using namespace std; int main() { cout << time(0)<<endl;//返回一个秒数 for (int i = 0; i < 3; i++) cout << rand() << endl;//pesudo radom srand(time(0)); for (int i = 0; i < 3; i++) cout << rand()%10 << endl;//truly random return 0; }
首先输出一个秒数。
接着输出了3个随机数,这三个随机数每次都是相同的。
使用时间作为seed,rand()函数的返回值。
产生3个真随机数,其范围是[0,10)。