srand((unsigned int)time(NULL))引发的思考

这几天刷题碰到这句函数:srand((unsigned int)time(NULL))

一看之下,有点印象,但就是说不清楚,挺气人的,就想着弄明白这个东西跟大家分享分享

1,srand跟rand的关系:

2,time函数的简单用法;

3,参数执行的优先级

关于srand

这个函数在C/C++中经常跟rand函数一起使用,srand是随机数发生器的初始化函数
在C中:这两个函数都位与<stdlib.h>头文件里面
在C++中:两个函数都位与(被包含于iostream中)

原型:void srand(unsigned int seed)

void rand (void)

seed相当于一个种子,srand函数根据这个种子seed,设置一个随机起点,而rand函数根据这个随机起点,返回一个随机数【seed ,RAND_MAX】,其中RAND_MAX是0x7ffff,但是是一个伪的随机数(多次编译产生的随机数是一样的,除非给一个变化的种子)

值得注意的是:
rand函数每一次被调用的时候,它都会查看之前是否调用了srand函数

  1. 如果调用了,则会调用srand(seed)来初始化它的随机值

  2. 如果没有调用,则会默认的调用srand(1)来初始化它的随机值

所以说:即使程序中没有调用srand,也和调用了srand(1)是一样的效果;并且为了让每一次程序的调用都产生不同的值,所以常常使用系统时间来初始化,也就引入了time(NULL),这里,我们会在后面提到

程序1:(没有设置种子seed,没有调用srand时)

#include <conio.h>
#include <cstdlib>
#include <iostream>
using namespace std;
 
int main(int  argc, char *argv[],  char *envp)   //这里的参数可以不写的
{
	int  k;
	
	for(int i = 0; i<5; i++){
		cout<<rand()%10<<",";
	} 
	cout<<endl;
	getch();
	return 0;
} 

运行结果:
在这里插入图片描述

程序2:(种子seed为1时)

#include <conio.h>
#include <cstdlib>
#include <iostream>
using namespace std;
 
int main(int  argc, char *argv[],  char *envp)   //这里的参数可以不写的
{
	int  k;
	srand(1);
	for(int i = 0; i<5; i++){
		cout<<rand()%10<<",";
	} 
	cout<<endl;
	getch();
	return 0;
} 

运行结果:
在这里插入图片描述

程序3:(种子seed为2时)

#include <conio.h>
#include <cstdlib>
#include <iostream>
using namespace std;
 
int main(int  argc, char *argv[],  char *envp)   //这里的参数可以不写的
{
	int  k;
	srand(2);
	for(int i = 0; i<5; i++){
		cout<<rand()%10<<",";
	} 
	cout<<endl;
	getch();
	return 0;
} 

运行结果:
在这里插入图片描述

上面三个程序中的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++中头文件为
原型为: time_t time(time_t * timer) (其中time_t是long int)

char * ctime(const time_t *time)

程序:

#include <stdio.h> 
#include <conio.h>
#include <time.h>
 
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; 
}

运算结果:

在这里插入图片描述

可以看到time(0)得到了一个很大的大整数,是从1970年1月1日零时零分零秒到目前为止所经过的秒数,而ctime函数将这个值,转化为了常规的时间

关于优先级

我们可以看到这个函数的参数:(unsigned int)time(0)

从优先级的角度看,这些都是单目运算符,单目运算符的处理顺序是从右往左的,所以上面的处理过程是:对于time函数,给了一个参数为0的值,返回一个当前系统时间的秒数,然后在将其强转为unsigned int类型

还有如同(*p++):这个也是单目运算符,处理也是从右往左的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值