关于srand函数的疑问:

来源于 3-9 猜数字随机种子。观察这段代码,本身是一个产生随机数打印的代码,num 每次都会由于系统时间的变化,而形成不同的数。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>int main(){int num;int count = 0;srand(time(NULL));while(1){count++;num = rand();printf("%d ", num);if(count>10){break;}}return 0;
}
24954 8985 31793 19709 25748 25933 7249 23719 30897 9696 4377

但是如果把 srand(time(NULL)); 这段代码放入 while 中会发生什么?

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>int main(){
int num;
int count = 0;while(1){
srand(time(NULL)); count++;num = rand();printf("随机数为 %d",num);printf("       time: %lld\n", time(NULL));if(count>10){break;}
}
}
随机数为 26568       time: 1654333044
随机数为 26568       time: 1654333044
随机数为 26568       time: 1654333044
随机数为 26568       time: 1654333044
随机数为 26568       time: 1654333044
随机数为 26568       time: 1654333044
随机数为 26568       time: 1654333044
随机数为 26568       time: 1654333044
随机数为 26568       time: 1654333044
随机数为 26568       time: 1654333044
随机数为 26568       time: 1654333044

结果就是,num 不再是随机值,而是固定的数值,原因可以参考 https://www.imooc.com/wenda/detail/604944,大体意思是伪随机数的产生依赖种子,种子的时间间隔至少1s才可以生成不同的随机数,放在一个循环中时,由于两行代码之间运行时间间隔不大,导致种子未发生变化,所以没有改变随机数。

但是!!如果还是放在外面

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>int main(){
int num;
int count = 0;
srand(time(NULL));
while(1){count++;num = rand();printf("随机数为 %d",num);printf("       time: %lld\n", time(NULL));if(count>10){break;}
}
}

每次我打印出来的时间,显示出来还是相同的,为什么?明明随机数不同

随机数为 26359       time: 1654332980
随机数为 10512       time: 1654332980
随机数为 12907       time: 1654332980
随机数为 12245       time: 1654332980
随机数为 4567       time: 1654332980
随机数为 10491       time: 1654332980
随机数为 2115       time: 1654332980
随机数为 10175       time: 1654332980
随机数为 20225       time: 1654332980
随机数为 20235       time: 1654332980
随机数为 6314       time: 1654332980

把 srand() 放入 while 循环中,时间也是不会变化的,这时随机数也不变了。

为什么 srand() 放在循环体外面,打印的时间是不变的,但是随机数是变化的,难道是随机数变化,但是我查看不到吗??

srand((unsigned)time(NULL)) 详解

srand 函数是随机数发生器的初始化函数。

原型:

void srand(unsigned seed);

用法: 它初始化随机种子,会提供一个种子,这个种子会对应一个随机数,如果使用相同的种子后面的 rand() 函数会出现一样的随机数,如: srand(1); 直接使用 1 来初始化种子。不过为了防止随机数每次重复,常常使用系统时间来初始化,即使用 time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数,即: srand((unsigned) time(&t)); 还有一个经常用法,不需要定义time_t型t变量,即: srand((unsigned) time(NULL)); 直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的数据。

进一步说明下:计算机并不能产生真正的随机数,而是已经编写好的一些无规则排列的数字存储在电脑里,把这些数字划分为若干相等的N份,并为每份加上一个编号用srand()函数获取这个编号,然后rand()就按顺序获取这些数字,当srand()的参数值固定的时候,rand()获得的数也是固定的,所以一般srand的参数用time(NULL),因为系统的时间一直在变,所以rand()获得的数,也就一直在变,相当于是随机数了。只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟。如果想在一个程序中生成随机数序列,需要至多在生成随机数之前设置一次随机种子。

 即:只需在主程序开始处调用 srand((unsigned)time(NULL)); 后面直接用rand就可以了。不要在 for 等循环放置 srand((unsigned)time(NULL));

void test_rand(void){unsigned long n;srand((unsigned)time(NULL));for(int i = 0; i < 100; i++){n = rand();printf("d\n", n);}
}

关于srand函数的疑问相关推荐

  1. C++:rand()函数和srand()函数解读

    (1)srand(unsigned int t)这个是设定种子. 因为电脑取随机数是伪随机,只要种子一样,则取出来的数一定一样. 这里用time(0)这个内函数,copy则是返回了当前的时间值. 这个 ...

  2. C语言rand(),srand()函数真实性能分析

    一直听人说c标准库的rand(), random()随机数产生函数性能极差.一直信以为真,今天做实验,发现并非如此 实验结论如下: 1. 系统自带的rand()和random()函数性能极高,大约相当 ...

  3. C语言之rand()和srand()函数

    1.rand().srand()函数介绍 srand 初始化随机种子,rand 产生随机数 定义函数:int rand(void) 函数功能:产生随机数 函数说明:rand的内部实现是用线性同余法做的 ...

  4. C++ rand()函数和srand()函数

    随机数和伪随机的区别 : #include<iostream> using namespace std; #include<string>#include<string& ...

  5. C语言中 srand()函数和rand()函数

    一.rand() rand()函数需要的头文件是:<stdlib.h> rand()函数原型:int rand(void); rand()函数用来产生随机数,但是,rand()的内部实现是 ...

  6. C语言:srand函数与rand函数的使用(纯干货)【易懂】

    C语言:srand函数与rand函数的使用(纯干货)[易懂] 文章目录 C语言:srand函数与rand函数的使用(纯干货)[易懂] 一.rand() 二.srand() 三.time() 四.运用: ...

  7. rand()和srand()函数

    srand 初始化随机种子,rand 产生随机数. rand函数 头文件: <stdlib.h> 定义函数:int rand(void) 函数功能:产生随机数 函数说明:因为rand的内部 ...

  8. rand()和srand()函数的用法

    一.rand() rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的. rand()会返回一个范围在0到RAN ...

  9. rand函数和srand函数的用法和区别

    srand初始化随机种子,rand产生随机数 rand(产生随机数) 表头文件: #include<stdlib.h>           //标准库 <cstdlib> (被 ...

  10. C语言学习笔记07-2-循环的游戏实验:猜数字(附rand、srand函数说明)

    C语言猜数字游戏实验(07-1笔记的补充) 在C/C++编程练习中代码太多,不能明显体现有关分支.循环语句结构的实验变化,在此处单独归纳汇总一份我尝试过的三次猜数字游戏设计. 猜数字初版 #inclu ...

最新文章

  1. 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
  2. vs shortcut
  3. Eclipse开发环境设置
  4. 此计算机支持多个rdp侦听程序,远程桌面侦听器证书配置
  5. asp.net core 中使用 signalR(二)
  6. php 后退 触发事件,php – 后退按钮的会话问题
  7. php 属性名字访问,php – 如何使用连字符的名称访问此对象属性?
  8. js浮点数加减乘除精度不准确
  9. 如何在Linux上录制你的终端操作
  10. WebRTC中码率限制参数使用及sdp中参数使用流程
  11. [网络安全自学篇] 八十七.恶意代码检测技术详解及总结
  12. 解决NVIDIA官网打开速度过慢的 CUDA下载界面打开过慢
  13. 前端实现动画的7种方式
  14. erp实施 数据库面试题_erp实施顾问笔试题有什么_erp实施顾问笔试题
  15. 宁皓网bootstrap
  16. 高中计算机手抄报图片大全集,高中生手抄报版面图大全
  17. python txt文本特定字符串提取
  18. Head First Statistics one 做图规则
  19. Python 书籍 搜索
  20. 通过java程序模拟实现地铁票价2+2=12(r3笔记第94天)

热门文章

  1. Unity手机游戏广告接入的大致思路(Android和iOS)
  2. js 输出为underfined
  3. 基于 SpringBoot 手写 RPC 框架
  4. 微信wifi服务器地址,从零开始改造路由器实现微信连WIFI的功能(七):更简单的认证服务器wifidog-server...
  5. 长期成本曲线为何是短期成本曲线包络线?——用包络定理证明
  6. 继电器驱动电路(各种单片机、CD4013触发器驱动电路图)
  7. keil与proteus联调C语言,51keil与proteus联调,实现在线仿真
  8. cocos creator快速上手《摘星星》官方教程续|星月爸爸
  9. Android setLayoutparams失效几个原因
  10. 公众号淘客怎么运营推广,找到适合自己的的推广方法才有效