【C语言笔记】关于随机数的总结

C语言的库头文件stdlib.h中有个生成随机数的函数:

int rand(void);

该函数返回0~RAND_MAX之间的随机数,在stdlib.h中可知道,RAND_MAX为0x7FFF,如:

但这里生成的随机数为伪随机数。所谓的伪随机数简单来说就是每次运行程序产生的随机数都是一样的。
示例程序:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
 printf("%d\n",rand());
 return 0;
}

程序运行结果为:
程序连续运行三次,产生的由rand()函数产生的随机数都是一样的,这就是伪随机数。
那么如何才能产生真正的随机数呢?其实头文件stdlib.h里还有另一个函数:
void srand(unsigned int seed);
这个函数的作用是产生随机数种子,rand()函数会根据seed的值来产生随机数,若在这调用rand()函数之前没有调用srand进行播种,则seed的值就没变,则产生的随机数就是伪随机数。所以,只要种子seed的值改变,那么调用rand()函数产生的随机数就是真正的随机数。
示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
 srand(1);    
 printf("%d\n",rand());
 srand(2);
 printf("%d\n",rand());
 srand(3);
 printf("%d\n",rand());
 return 0;
}

程序运行结果为:
可见,种子seed不一样,生成的随机数就不一样,即真实的随机数
把seed的值改为相同的,则产生的随机数就是伪随机数.
示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
 srand(520);
 printf("%d\n",rand());
 srand(520);
 printf("%d\n",rand());
 srand(520);
 printf("%d\n",rand());
 return 0;
}

程序运行结果:
种子seed不变,产生的随机数就是一样的,即伪随机数
那么,怎么才能较方便地设置随机数的种子呢?可以使用time()函数的返回值作为随机数种子,time()函数返回的是1970年1月1日至现在的秒数,每一时刻都是不一样的,即每一时刻seed的值都不一样。关于time()函数的详细说明可看小编的上一篇文章哦。传送门:【C语言笔记】时间日期函数
接下来编写一个程序用于产生10个10以内的随机数,示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
 int loop;
 srand((unsigned)time(NULL));
 for (loop = 0; loop < 10; loop++)
 {
   printf("%d\n",rand()%10);
 }
 
 return 0;
}

程序运行结果为:
除此之外,若要生成a~b之间的数字,可以使用rand()%(b-a+1)+a
以上就是关于随机数的总结,要注意srand()函数应与rand()成对使用,并且在调用rand()函数之前应先调用srand()进行播种,每次播的随机种子应该是不一样的,否则产生的随机数就是伪随机数。可用time()函数的返回值作为随机种子,这是典型做法。

常用关键字列表

(0)

相关推荐

  • 【知识】C语言随机数生成,C语言rand和srand用法详解

      在实际编程中,我们经常需要生成随机数.例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生 ...

  • C语言笔记-双向链表和循环链表

    两种链表的增删改查操纵类似于单向链表. 双向链表: 一种更复杂的链表是"双向链表"或"双面链表".每个节点有两个连接:一个指向前一个节点,(当此"连接 ...

  • 辛苦整理的C语言笔记,还好没放弃

    c语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...

  • 【C语言笔记】时间日期函数

    常持正念方圆梦,不忘初心总是春. /********前言********/ time.h是C/C++中的日期和时间头文件.用于需要时间方面的函数.下面分享time.h头文件中几个常用函数的用法: /* ...

  • 【C语言笔记】变参函数

    提到变参函数,我们的感觉是不是既熟悉又陌生 ?感觉熟悉是因为我们平时都在使用着,如我们常使用的printf()函数与scanf()函数就是典型的变参函数.因为printf()函数是变参函数我们才可以根 ...

  • 【C语言笔记】ASCII码可见字符与不可见字符

    ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧 ...

  • 【C语言笔记】什么是ANSI C标准?

    我们在很多地方都有看到过K&R C.ANSI C.ISO C.C89.C99.C11等标准,具体有什么不同呢?(文末有个很好的实例) 什么是K&R C? 1978年,丹尼斯·里奇(De ...

  • 【C语言笔记】如何查看数据类型范围?

    知识点一:查看整数范围 当前的编译环境下,你可能不知道int的数据范围是多少,或者记不清无符号短整型的范围是0~65535还是0~65536?这时候就可以按照如下程序进行输出查看: #include ...

  • 【C语言笔记】分享一个C语言测试程序模板

    前言 平时需要测试一些比较模糊的知识点,或则想要验证一些函数时,我们常常会建一个test.c文件,然后在这个文件里写我们的测试代码,测试完毕后常常会删掉该文件.下次再遇到同样的问题的时候,可能又是记不 ...

  • 【C语言笔记】你的黑窗口闪退?

    上一篇中写到了Windows下体验Linux环境,其中的测试代码简单的打印一句话,如: 编译后得到test.exe,运行得到如下结果: 在命令行下运行可以输出结果,但是在文件夹下,双击运行test1. ...