了解随机函数rand()

C语言有自己的随机函数 rand(),使用随机函数需要的头文件为<stdlib.h>。调用了rand()即可生成0-RAND_MAX之间的随机数,关于rand()说明可参考 该文章

rand() 函数可生成一个伪随机数,这个数范围是 0-RAND_MAX 。根据rand函数定义:int rand(void),此时 RAND_MAX 的范围至少在 32767 之间(int),即双字节(16位),倘若用的是 unsigned int 定义,那么是 65535。据此也知道利用 rand函数生成的数是整型数据。(按了解是这样)

rand() 函数生成的是假随机数,即每次执行时得到的结果是相同的,若要不同那需要以不同的值来初始化,初始化的函数就是srand()。

控制范围

在实际应用时,我们通常需要得到一定范围内的随机数。那么这是可以利用取余的原理来执行。

取余原理:对任意两个整数x 和 y,它们在整数的 除法 中,只有能整除与不能整除两种情况。不能整除则得到余数,对于x%y,得到的余数的范围是[0,y-1]。根据数学知识,倘若要得到[x,y]范围的余数,那么可以先获取[0,y-x]范围的余数,此时表达式应为x%(y-x+1);再求[x,y]范围的余数,表达式应为x%(y-x+1)+x

那么将这原理应用于rand函数,无论使用它生成了[0,RAND_MAX]的哪个随机数,只要表达式为rand()%(y-x+1)+x,那么即可得到范围为[x,y]内的一个随机数。举个例子,令x=0,y=100,则表达式为rand()%101,此时计算机则提供给你一个范围在[0,100]内的随机整数。

值得注意的是,C语言提供的 rand 函数 是伪随机数,如果不做其它处理,那么每次运行程序获取到的随机数序列是固定的。为了解决这个问题,C语言还定义了 srand() 这个库函数,用来设定一个随机数种子,从而得到一个不确定的随机初始值。

获取真随机数

若仅仅使用上述方法,我们无法让每次运行程序得到的随机数不一样。这个时候我们需要 srand() 函数,这个函数需要的头文件同样为 <stdlib.h>,它的定义:void srand(unsigned int seed),功能:srand() 用来设置 rand() 产生随机数时的随机数种子,参数 seed 必须是整数,通常可以用 time(0) 的返回值作为 seed.如果每次 seed 都设置相同的值,rand() 产生的随机数值每次都一样。

srand() 函数要求有一个int型的参数,这个参数比较常见的做法是用time(NULL) 来获取当前微秒数来充当。于是一个完整的设定随机数种子的操作为srand(time(NULL)),其中 time函数 需要引入<time.h>来声明。且 srand() 需要在第一次调用 rand 前调用。

实际操作

单纯只用rand()函数

//抽取10个值在[0,100]范围内的随机数程序可以写成
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int i;
    for(i = 0; i < 10; i ++)
        printf("%d\n", rand()%101);//这里增加了模除运算,由于最小值就是0,所以不需要加法了。
    return 0;
}

两次运行结果分别为:

rand1

rand2


同时使用rand()和srand()函数:

获取[0,100]间10个随机整数
#include<stdio.h>
#include <stdlib.h>
#include <time.h> //增加time函数的头文件
int main()
{
    int i;    
    srand(time(NULL));//设置随机数种子,只需要调用一次即可,且需在第一次调用rand()前调用。     
    for(i = 0; i < 10; i ++)
        printf("%d\n", rand()%101);         
    return 0;
}

两次运行结果分别为:

srand1

srand2


参考文章:

百度问答

有关rand(),srand()产生随机数学习总结

Q.E.D.

本文由 ruchan 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
本文链接:https://crcrc.cn/archives/c-random-number
最后更新于:2021-08-15 21:08:12


Not afraid of the future, not thinking of the past.