在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数。在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下:

  int __cdecl rand(void);

  rand函数没有参数,它的返回值就是随机数。下面通过一个简单的例子来测试一下rand函数。

#include <stdio.h>
#include <stdlib.h>int main(int argc, char** argv) {int i;i = rand();printf("%d",i);return 0;
}

  直接调用rand函数产生一个随机数,并打印出来。运行结果如下:

  此时生成的随机数为41,下面多生产几个随机数看看。

  通过一个for循环产生10个随机数,通过打印的结果可以看到第一个随机数是41,其他后面9个数据都比较大。将随机次数改为15,在测试一次。

  此时产生了15个随机数,但是通过和产生10个随机数相比可以发现,这次产生的随机数前面10个数字和上次一模一样。将程序重新运行之后,产生的随机数和上一次也一模一样。

  这时什么原因呢?难道随机数生成函数rand出现了bug?

  实际上通过rand函数产生的随机数是伪随机数,它是根据一个数值然后通过公式计算出来一个值,将计算的结果作为随机数返回。这个固定参考的数值就被称为“种子”,每次计算机启动时就会生成一个种子,然后在以后运行的过程中种子就不会在发生变化了。所以每次执行rnad函数的时候,它参考值种子值都是固定的,因此每次生成的随机数也就是固定的。如果要每次生成的随机数不同,那么每次产生随机数之前就需要改变种子的值。

  种子的值是由srand函数来产生的,函数原型如下:

  void __cdecl srand(unsigned int _Seed);

  函数没有返回值,它的参数就是需要设置的种子值。将修改种子的函数也添加到代码中。

  将种子值设置为10,然后生成10个随机数。

  将种子值设置为20,然后生成10个随机数。

  可以看到当种子的值发生变化后,生成的随机数也就发生了变化。如果程序中需要重复的使用随机的话,那么随机种子的值就不能时一个定值,它必须时刻发生变化,这么生成的随机数才能时刻发生变化。在系统中时刻发生变化的数字,首先能想到的就是时间,因为时间实时都在发生变化,不可能出现同样的值。

  那么就可以将获取系统的时间,然后作为随机数的种子。时间函数time原型如下:

__CRT_INLINE time_t __cdecl time(time_t *_Time) { return _time64(_Time); }

  调用time函数后,它就会返回当前系统的时间的秒数,它的参数可以直接设置为NULL。

  调用time函数时,需要添加头文件time.h。将时间值作为随机种子,这样每次生成的随机数就会不同,但是通过上面的输出结果可以看到,每次生成的随机数大小都变化很大,如果要将随机数的大小控制在一定范围内要怎么办呢?

  要控制数字的范围,那么可以使用数学的取余数运算,如果要将生成的数字控制在10以内,那么对生成的数字除以10,然后取余数。这样余数的大小就不会超过10。

  这里对生成的随机数除以100取余,这样最后产生的随机数都会在100以内。

C语言学习笔记---随机数rand()函数相关推荐

  1. c语言中void arrout,c语言学习笔记(数组、函数

    <c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...

  2. c语言随机字符rand,C语言中生产随机数 rand()函数

    一:如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdlib.h, 其值为214748 ...

  3. c语言学习笔记之分段函数

    内容来自哔哩哔哩视频 [浙江大学]C语言入门与进阶 翁恺 学习笔记 分段函数 if ( x < 0 ) { f = -1; } else if ( x == 0 ) { f = 0; } els ...

  4. Go 语言学习笔记(二):函数

    目录 函数 函数定义 函数签名和匿名函数 defer 闭包 概念 panic 和 recover 函数 函数是程序执行的一个基本语法结构,Go 语言的很多特性是基于函数这个基础实现的,比如命名类型的方 ...

  5. C语言学习笔记---数据拷贝函数memcpy()和memmove()函数

      在C语言中拷贝字符串的时候通常可以使用strcpy()函数和strncpy()函数,这两个函数是专门针对字符串拷贝的.如果想要拷贝其他类型数组的话,可以使用memcpy()和memmove()函数 ...

  6. C语言学习笔记---字符串查找函数strstr()和strpbrk()函数

    strstr()函数   C语言中如何向查找一个字符串中是否包含另一个字符串,可以使用strstr()函数.使用示例如下: int main(int argc, char *argv[]) {char ...

  7. 【C语言学习笔记】SWAP函数详解

    SWAP函数详解 本篇文章通过swap函数来深入了解C语言中函数的用法,与指针的应用.参考资料来源于经典书籍与技术博客的分享. 在复习完生存期相关的知识点后(详情可转至此处),初步认识了函数与本地变量 ...

  8. R语言学习笔记之transform函数

    transform函数 在console终端中敲入:?transform Transform an Object,for Example a Data Frame Description transf ...

  9. C语言学习笔记---字符串转换函数

    字符串转整数   字符串转换为整数的函数有两个,他们的函数原型如下: int __cdecl atoi(const char *_Str);long __cdecl atol(const char * ...

最新文章

  1. Webservices
  2. 阿里云发布云电脑“无影”,「传统桌面云」市场将被颠覆?
  3. UVa11402 Ahoy, Pirates!
  4. 为什么程序员需要关心顺序一致性(Sequential Consistency)而不是Cache一致性(Cache Coherence)
  5. boost::sort模块实现使用字符串键和索引函子对结构进行排序的示例
  6. C和C++编程中static关键字的含义-修饰函数和变量
  7. 企业网站 源码 e-mail_天津seo优化套餐服务收费_天津网站优化关键词价格
  8. JEECG(J2EE Code Generation) 基于代码生成器J2EE智能开发框架 杂记:发布新版本 JEECG_v2.0
  9. java 消费者模式 多线程_[Java并发-24-并发设计模式] 生产者-消费者模式,并发提高效率...
  10. TokenInsight:反映区块链行业整体表现的 TI 指数较昨日同期下跌1.03%
  11. SAP License:2021年最新FICO面试答案
  12. 服务器系统如何校验md5值,什么是md5校验工具,md5校验工具怎么用?
  13. 高等数学同济七版课后习题答案
  14. linux qq 提示错误,deepin-wine QQ崩溃,QQ遇到错误的暂时解决方法
  15. 60款mac超酷炫动态苹果免费屏保壁纸
  16. css vue 内联_vue ssr css内联样式和link标签重复
  17. 2022秋软工实践 团队展示与选题报告
  18. windows下使用精灵标注图片
  19. 高德地图API定位失败 浏览器定位 IP定位
  20. UART串口传图LCD显示----图像处理

热门文章

  1. 鬼谷子72术,完整收藏
  2. 11. 搭建一个完整的K8S集群
  3. Day26:configparser、subprocess模块
  4. SQL Server 数据加密功能解析
  5. Qt中图像的显示与基本操作
  6. 【推荐】SQL Server 2008 R2 中英文 开发版/企业版/标准版 下载
  7. 一个简单的iBatis入门例子
  8. 11.springcloud的springconfig配置
  9. 使用JMeter如何实现上传文件
  10. docker 搭建 web_《SpringBoot+Dubbo+Zookeeper整合搭建简单的分布式应用》