1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

 

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

int rand(void);

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

C语言 | 关于随机数的总结_编程开发

 

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

示例程序:

#include <stdio.h>
#include <stdlib.h>

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

 程序运行结果为:

C语言 | 关于随机数的总结_编程开发_02

 程序连续运行三次,产生的由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;
}

程序运行结果为:

C语言 | 关于随机数的总结_编程开发_03

 

可见,种子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;
}

 程序运行结果:

C语言 | 关于随机数的总结_编程开发_04

 那么,怎么才能较方便地设置随机数的种子呢?可以使用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;
}

 程序运行结果为:

C语言 | 关于随机数的总结_编程开发_05

 除此之外,若要生成a~b之间的数字,可以使用rand()%(b-a+1)+a

以上就是关于随机数的总结,要注意srand()函数应与rand()成对使用,并且在调用rand()函数之前应先调用srand()进行播种,每次播的随机种子应该是不一样的,否则产生的随机数就是伪随机数。可用time()函数的返回值作为随机种子,这是典型做法。