【C++】关于#include<ctime>与srand(time(NULL))

参考博客: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++):这个也是单目运算符,处理也是从右往左的

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页