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

来源链接:https://blog.csdn.net/msdnwolaile/article/details/50707481?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2

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

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

1,srand跟rand的关系:

2,time函数的简单用法;

3,参数执行的优先级



1.  关于srand

这个函数在C/C++中经常跟rand函数一起使用,srand是随机数发生器的初始化函数

        在C中:这两个函数都位与<stdlib.h>头文件里面

     在C++中:两个函数都位与<cstdlib>(被包含于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时)


  
  
  1. #include <conio.h>
  2. #include <cstdlib>
  3. #include <iostream>
  4. using namespace std;
  5. int main(int argc, char *argv[], char *envp) //这里的参数可以不写的
  6. {
  7. int k;
  8. for( int i = 0; i< 5; i++){
  9. cout<<rand()% 10<< ",";
  10. }
  11. cout<< endl;
  12. getch();
  13. return 0;
  14. }
运行结果:



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


  
  
  1. #include <conio.h>
  2. #include <cstdlib>
  3. #include <iostream>
  4. using namespace std;
  5. int main(int argc, char *argv[], char *envp) //这里的参数可以不写的
  6. {
  7. int k;
  8. srand( 1);
  9. for( int i = 0; i< 5; i++){
  10. cout<<rand()% 10<< ",";
  11. }
  12. cout<< endl;
  13. getch();
  14. return 0;
  15. }
运行结果:



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


  
  
  1. #include <conio.h>
  2. #include <cstdlib>
  3. #include <iostream>
  4. using namespace std;
  5. int main(int argc, char *argv[], char *envp) //这里的参数可以不写的
  6. {
  7. int k;
  8. srand( 2);
  9. for( int i = 0; i< 5; i++){
  10. cout<<rand()% 10<< ",";
  11. }
  12. cout<< endl;
  13. getch();
  14. return 0;
  15. }
运行结果:


     

上面三个程序中的main函数参数是三个,是main函数的固有本质类型,可以省略不写或者写void

最后有一个同用的公式:

要取得[a,b)的值可以用:(rand()%(b-a))+   a;(当a为0时,可以用rand()%   b)

取得伪随机浮点数:         (rand()/   double(RAND_MAX))可以取得0-1之间的浮点数,如果想获得更大的随机值可以通过(rand()/   double(RAND_MAX)/  10)以此类推



2.  关于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)

程序:


  
  
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <time.h>
  4. int main(void)
  5. {
  6. time_t t;
  7. t = time( 0); //同时这里也可以写作 time(NULL)
  8. printf( "秒数为: %ld \n" , t);
  9. printf( "Today's date and time: %s", ctime(&t));
  10. getch();
  11. return 0;
  12. }

运算结果:



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


3.  关于优先级

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

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

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



参考:百度百科

          yision的博客http://blog.sina.com.cn/yeesion

          李树花开,风中摇曳的客:http://blog.csdn.net/lishuhuakai/article/details/8964852

大家共同学习,共同进步!!!

发布了103 篇原创文章 · 获赞 29 · 访问量 4943

猜你喜欢

转载自blog.csdn.net/weixin_43956456/article/details/105664191