参考博客:srand((unsigned int)time(NULL))引发的思考
一、srand()
与rand()
srand
是随机数发生器的初始化函数。- 在c中:两个函数都位于
<stdlib.h>
头文件中; - 在c++中:这两个函数都位于
<cstdlib>
(被包含与iostream
中) - 原型:
void srand (unsighed int seed)
void rand (void)
seed相当于一个种子,srand函数根据这个种子seed,设置一个随机起点,而rand函数根据这个随机起点,返回一个随机数[seed, RAND_MAX],其中RAND_MAX是0×7ffff,但是是一个伪的随机数(多次编译产生的随机数是一样的,除非给一个变化的种子)
- 注意:rand函数每一次被调用的时候,都会查看之前是否调用了srand函数。
- 若调用了,则会调用srand(seed)来初始化它的随机值;
- 若没有调用,则会默认的调用srand(1)来初始化它的随机值;
- 因此,即使程序中没有调用srand,也和调用了srand(1)是一样的效果,并且为了让每一次程序的调用都产生不同的值,所以常常使用系统时间来初始化,也就引入了
time(NULL)
程序一:(没有设置种子seed,没有调用srand)
#include <conio.h>
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int k;
for (int i = 0; i < 5; i++)
{
cout << rand()%10 << ","; // rand()%10:表示将生成的随机数对10取余,即获得了范围0~9的一个随机数
}
cout << endl;
getch();
return 0;
}
运行结果:
1,7,4,0,9
getch()
- 所在头文件:
<conio.h>
- 函数用途:从控制台读取一个字符,但不显示在屏幕上
- 函数原型:
int getch(void)
- 返回值:读取的字符
- 例如:
char ch;或int ch;
getch();或ch=getch();
用getch();会等待你按下任意键,再继续执行下面的语句;用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。 - 易错点:所在头文件是conio.h。而不是stdio.h。
- 所在头文件:
程序二:(种子seed为1时)
#include <conio.h>
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int k;
srand(1);
for (int i = 0; i < 5; i++)
{
cout << rand()%10 << ","; // rand()%10:表示将生成的随机数对10取余,即获得了范围0~9的一个随机数
}
cout << endl;
getch();
return 0;
}
运行结果:
1,7,4,0,9
程序三:(种子seed为2时)
运行结果:
5,6,8,5,4,
上面三个程序中的main函数参数是三个,是main函数的固有本质类型,可以省略不写或者写void
最后有一个同用的公式:
- 要取得[a,b)的值可以用:
(rand() % (b - a)) + a;
(当a为0时,可以用rand()% b;
) - 取得伪随机浮点数:
(rand() / double(RAND_MAX))
可以取得0-1之间的浮点数,如果想获得更大的随机值可以通过(rand() / double(RAND_MAX) / 10)
以此类推
二、关于time
time
函数可以获取当前的系统时间(但是获取的是秒数,是从1970年1月1日零时零分零秒到目前为止所经过的时间),ctime
可以将其转化为常规的时间。
在c中的头文件为<time.h>
,在c++中头文件为<ctime>
。
- 原型:
time_t time (time_t *timer) // 其中time_t是long int
char* ctime (const time_t *time)
程序:
#include <stdio.h>
#include <conio.h>
#include <ctime>
int main(void)
{
time_t t;
t = time(0); // 这里也可以写time(NULL)
printf("秒数为:%ld \n",t);
printf("Today's date and time: %s",ctime(&t));
getch();
return 0;
}
运行结果:
秒数为:1599744675
Today's date and time: Thu Sep 10 21:31:15 2020
可以看到time(0)得到了一个很大的大整数,是从1970年1月1日零时零分零秒到目前为止所经过的秒数,而ctime函数将这个值,转化为了常规的时间
三、关于优先级
我们可以看到这个函数的参数:(unsigned int) time (0)
从优先级的角度看,这些都是单目运算符,单目运算符的处理顺序是从右往左的,所以上面的处理过程是:对于time函数,给了一个参数为0的值,返回一个当前系统时间的秒数,然后在将其强转为unsigned int类型
还有如同(*p++):这个也是单目运算符,处理也是从右往左的