1. 概述
本文讲述 rand,srand,以及产生固定范围内的随机数。
2. rand 函数
可以使用 <stdlib.h> 头文件中的 rand() 函数来生成随机数,随机生成一个位于 0 ~ RAND_MAX 之间的整数。它的用法如下:
int rand ();
为什么不使用 random() 函数?
具体用例:
#include <stdio.h>
#include <stdlib.h>
int main(){
int randnum = rand();
printf("%d\n", randnum);
return 0;
}
在我的虚拟机上显示的结果是
1804289403
我的虚拟机版本如下
$ cat /proc/version
Linux version 4.18.0-20-generic (buildd@lcy01-amd64-020)
(gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3))
#21~18.04.1-Ubuntu SMP Wed May 8 08:43:37 UTC 2019
3. 随机种子 srand 函数
rand() 函数产生的随机数是伪随机数,是根据一个数值按照某个公式推算出来的,这个数值我们称之为“种子”。因此在每次计算机启动的时候,种子被确定,所以 rand() 算出来的值就是固定的。
为什么重启计算机就固定了呢?这其中到底有什么样的机制?
如何改变种子?使用 srand 函数,用法如下:
void srand (unsigned int seed);
实例如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int testsrand;
srand((unsigned)time(NULL));
testsrand = rand();
printf("%d\n", testsrand);
return 0;
}
4. 产生固定范围内的随机数
我们经常需要产生给定范围内的随机数。那怎样才能做到呢?其实很简单,只需要借助取模和加法即可。
想象一下,假如我们需要从范围 [a, b] 的随机数 y。底线就是 a。即 x >= a。因此结果变成:
y = r % x + a
因此我们将目光聚焦于 (b - a),rand() 产生的结果 r ,r 对 x 取模的最大值为 (b - a), 因此,x = (b - a + 1)。公式变为:
y = r % (b - a + 1)+ a
实例如下:
/* 生成 [7, 10] 中的随机数 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int y;
srand((unsigned)time(NULL));
y = rand() % (10 - 7 + 1) + 7;
printf("%d\n",y);
return 0;
}
5. 直接可用的随机数生成函数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LEAST 7
#define LARGEST 10
int getRandom();
int main(){
int y = getRandom();
printf("%d\n",y);
return 0;
}
int getRandom(){
srand((unsigned)time(NULL));
return rand() % (LARGEST - LEAST + 1) + LEAST;
}
6. 总结
本文学习了 rand,srand,以及产生固定范围内的随机数。
不足之处在于对于一些很深刻的东西,并没有了解得很清楚。希望有机会再去了解。