这篇博客主要来讲解如何生成一个随机数
C语言提供了一个函数 rand , 这个函数可以生成随机数
如下是函数的原型:
int rand (void);
rand函数会返回一个伪随机数,在一般的编译器上,这个随机数的大小范围是0 - 32767
rand函数的使用需要包含一个头文件 stdlib.h
让我们来测试以下该函数对随机数的生成
下面两张图是两次运行的结果,我们可以发现这个函数确实生成了随机数,但是两次生成的函数却是一样的。这就是为何称其返回的是伪随机数的原因。
伪随机数只是相对随机的,而我们想要的是真正的随机数,真正的随机数应该是我们无法精准预判将要生成的数是什么。
其实,rand函数是对一个叫“种子”的基准值进行运算生成的随机数。
之所以每次程序运行产生的随机数是一样的,是因为rand函数生成随机数的默认种子是1,如果我们想要生成真正不同的随机数,那我们就需要让种子发生变化。
C语⾔中⼜提供了⼀个函数叫 srand,⽤来初始化随机数的⽣成器的
该函数的原型如下:
void srand (unsigned int seed);
程序中在调用rand函数之前先调用srand函数,通过函数srand的参数seed来设置rand函数生成随机数的时候的种子,只要种子发生变化,那么每次生成的随机数也会发生变化。
所以就是给srand函数的种子是随机的,那么rand函数就能生成真正的随机值。
在程序中我们一般是使用程序的运行时间来作为种子的,为什么呢?因为时间一直在变化。
在C语⾔中有⼀个函数叫 time ,可以获得这个时间
函数的原型如下:
time_t time (time_t* timer);
time函数会返回 1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒,也就是相差的秒数,所以是一直在变化的。
返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型。
time函数的参数 timer 如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。
如果 timer 是NULL,就只返回这个时间的差值。
timer 函数返回的这个时间差也叫作 :时间戳
比如我现在写这篇博客的时候 时间戳是
time函数使用的时候需要包含头⽂件:time.h
所以如果只想让函数返回时间戳我们可以这样写:
time(NULL);
那么一切就绪,我们想真正生成一个随机数,代码就为
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
//使用time函数设置种子
//因为srand的参数是unsigned int类型,我们将time函数的返回值类型强制转换
srand((unsigned int)time(NULL));
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
当我们再次执行程序,我们就会发现每次运行的结果都不一样,这是真正的随机数,大功告成啦!
当然,精益求精嘛。
还有一些我们是可以学习到的。
那就是随机数的--范围
如果我们要生成0 - 99的随机数:
rand() %100; // 0-99
如果要⽣成1~100之间的随机数:
rand()%100+1; // 1-100
如果要⽣成100~200的随机数
余数的范围是0 - 100,加上100后范围就是100 - 200
100 + rand()%(200-100+1)
所以我们就有一个技巧
所以如果要⽣成a~b的随机数,⽅法如下:
a + rand()%(b-a+1)
例子:生成0 - 99的随机数
总结:
随机数的生成还是很重要的,值得好好学习。通过随机数我们可以借此生成很多随机的东西,具体可以慢慢发现哟!