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

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

int rand(void);

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

但这里生成的随机数为伪随机数。所谓的伪随机数简单来说就是每次运行程序产生的随机数都是一样的。

示例程序:

#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的值都不一样。

接下来编写一个程序用于产生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()函数的返回值作为随机种子,这是典型做法。


我的个人博客:https://zhengnianli.github.io/

我的微信公众号:嵌入式大杂烩

[](


 上一篇
【C语言笔记】变参函数 【C语言笔记】变参函数
提到变参函数,我们的感觉是不是既熟悉又陌生?感觉熟悉是因为我们平时都在使用着,如我们常使用的printf()函数与scanf()函数就是典型的变参函数。因为printf()函数是变参函数我们才可以根据我们的需要灵活地输出变量的值。如: pr
2018-11-22
下一篇 
【C语言笔记】时间日期函数 【C语言笔记】时间日期函数
一、前言time.h是C/C++中的日期和时间头文件。用于需要时间方面的函数。下面分享time.h头文件中几个常用函数的用法: 二、time()函数1、函数原型 time_t time(time_t *t); 2、函数说明 time_t
2018-11-16
  目录