产生一个随机数(伪随机)的一种方法(c语言)

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

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

相关知识
  • 时间戳:
    这里的时间戳是为简单的概念,是当前计算机时间与1970年一月一日零时零分零秒的差值再换算成单位为秒的一串数字。
  • 随机种子:
    是计算机专业术语,一种以随机数作为对象的以真随机数(种子)为初始条件的随机数。一般计算机的随机数都是伪随机数,以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数。
    注:本文利用srand设置随机种子。
  • rand函数:
    简单理解是一个无需参数就能够产生0到32767之间的随机数且返回值为int类型的函数。
    函数原型:int rand (void)
    rand函数每次调用前都会查询是否调用过srand(seed),是否给seed设定了一个值,如果有,那么它会自动调用srand(seed)一次来初始化它的起始值,若之前没有调用srand(seed),那么系统会自动给seed赋初始值。
  • srand函数:
    简单理解是为rand函数设置一个随机起点。
    函数原型:void srand (unsigned int seed)
    是利用time函数来基于时间戳(时间与1970年一月一日0时0分0秒的差值以秒为单位)去设置随机数的生成起点,只调用一次就好(处于主函数即可),重复调用(位于自定义函数不理想)可能会与刚刚产生的随机数相近。

  • time函数:
    简单理解为返回当前计算机时间
    函数原型: time_t time(time_t *timer)
    参数说明: timer=NULL时得到当前日历时间(从1970-01-01 00:00:00到现在的秒数),timer=时间数值时,用于设置日历时间,time_t是一个unsigned long类型。如果 timer不为空,则返回值也存储在变量 timer中。
    函数功能: 得到当前日历时间或者设置日历时间
    函数返回: 当前日历时间
    是对typedef的重新命名,本质上为长整型 返回整形指针

  • NULL:
    简单理解为返回空指针。
    用于指示指针不引用有效对象。程序通常使用空指针来表示条件,被定义为 ((void*)0), 0 或 0L,这取决于编译器类型。
  • unsigned int:
    简单理解为强制类型转化为int类型的类型操作符
    要使用的话,则尽量避免有符号数与无符号数的比较运算和避免减法运算,在很多时候,在unsigned的世界里,x-y>0与x>y都是不等价的。
  • 相关头文件:、
    具体操作
    打印10个随机数
    #include <stdlib.h>
    #include <time.h>
    #include <stdio.h>
    int main()
    {
      int a;
      int b;
      srand((unsigned int)time(NULL));
      for (a = 1; a <= 10; a++)
      {
          b = rand();
          printf("%d ", b);
      };
      return 0;
    }
    
    若要求打印100以内随机数,则利用取模运算即可。
    #include <stdlib.h>
    #include <time.h>
    #include <stdio.h>
    int main()
    {
      int a;
      int b;
      srand((unsigned int)time(NULL));
      for (a = 1; a <= 10; a++)
      {
          b = rand()%100;
          printf("%d ", b);
      };
      return 0;
    }
    

    后注

    本人为初学者,所写可能存在错漏,如有发现,欢迎批评指正!
目录
相关文章
|
2月前
|
Java 编译器 C语言
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
26 3
|
6月前
|
C语言
c语言左旋字符串问题(不同方法超详细解答)
c语言左旋字符串问题(不同方法超详细解答)
30 1
|
6月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
123 7
|
6月前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
48 1
|
7月前
|
传感器 人工智能 物联网
【C 言专栏】C 语言与硬件交互的方法
【5月更文挑战第4天】C 语言在硬件交互中扮演关键角色,主要通过直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射I/O和设备驱动程序开发。挑战包括硬件多样性、实时性要求和错误处理。随着物联网和人工智能发展,C语言与硬件交互的需求增加,未来将面临更多新硬件和技术的挑战。本文旨在帮助读者理解和掌握这一领域的知识,以实现更高效的硬件互动。
211 1
【C 言专栏】C 语言与硬件交互的方法
|
6月前
|
IDE 编译器 开发工具
详细解读C语言程序设计:现代方法(第2版)第二章全部习题答案
详细解读C语言程序设计:现代方法(第2版)第二章全部习题答案
43 0
|
6月前
|
C语言
|
6月前
|
存储 C语言
C语言---求一个整数存储在内存中的二进制中1的个数--3种方法
C语言---求一个整数存储在内存中的二进制中1的个数--3种方法
|
7月前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
70 5
|
7月前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
58 3