1、rand函数
rand函数是c语言提供的一个可以生成随机数的一个函数,原型:int rand (void);
使用时需要包含头文件:stdlib.h
但是,rand生成的随机数仅仅只是伪随机数,这个伪随机数的范围在0~RAND_MAX之间,RAND_MAX的大小可能会因为不同编译器而不同,但大部分都为32767。为什么会说是伪随机数呢?这里做一个测试,运行两次下面的代码:
#include #include int main(){printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());return 0;}
会发现结果如下:
有上面的运行结果可以看出,三个随机数的生成各不同,但是连续两次生成的结果却一模一样,再多运行几次不难发现,每次运行的结果都是相同的。
再深入了解一下rand函数,就会发现,rand函数生成的随机数是伪随机数,不是真正的随机数。这是为什么呢?因为rand函数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。rand函数生成随机数的默认种子是1,所以之前每次的运行结果都是相同的。所以如果想要生成不同的随机数就需要让种子变化起来。这里便涉及到了另一个函数——srand函数。
2、srand函数
srand函数是用来初始化随机数的生成器的,原型:void srand (unsigned int seed);
程序在调用rand函数之前先调用srand函数来初始化随机数的生成器,初始化的结果由srand函数的参数seed来决定,只要参数seed是变化的,rand生成随机数的种子也将是变化的,每次生成的随机数也就会是变化的。那么参数seed选用什么呢?
3、time函数
在大多数情况下,一般是选用时间作为种子,时间是无时无刻都在发生变化的,为了获得时间,就会运用到time函数,time函数原型:time_t time (time_t* timer);
使用时也需要包含头文件:time.h
time函数会返回当前的日历时间,本质上是返回1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒,返回类型是time_t类型,time_t 类型本质上其实就是32位或者64位的整型类型。但如果time的参数timer是非NULL的指针的话,函数会在返回时间的差值的同时将返回值放在timer指向的内存中带回去,我们需要使用这个差值,便不能让他带回去,所以timer需要是NULL,这样才会只是返回差值,这个时间差也被叫做时间戳。
调⽤time函数返回时间戳时可写成:time(NULL);
但这里没有接收返回值。
4、随机数的生成
运用上面的三个函数,我们便能生成随机数了,最上面的代码便能改写为:
#include #include #include int main(){ srand((unsigned int)time(NULL));//这里因为srand的参数是unsigned int类型,所以为了保险起见将time函数的返回值进行强制类型转换 printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); return 0;}
进行多次运行,便能发现每次产生的值都是变化的了
5、生成范围的控制
由于原伪随机数的范围基本是0到32767,范围较大,有的时候需要控制范围使用,那么改这么办呢?
假如编写一个猜数字游戏,我们只需要它生成一个1到100的整数就可以了,就需要将rand()
改为rand()%100+1
,运行后得到的随机数就会在1到100之间。
如果要得到一个a到b的随机数,通用表达式如下:a + rand()%(b-a+1)