rand()
函数和 srand()
函数是C语言中用于生成伪随机数的两个标准库函数。
rand()
函数:
rand()
函数用于生成一个0到RAND_MAX(通常是32767)之间的整数伪随机数。- 每次调用
rand()
函数都会生成下一个伪随机数。 - 请注意,生成的伪随机数序列是可重复的,因为它是根据特定的算法生成的。如果你希望每次运行程序时获得不同的随机数序列,可以在使用
rand()
函数之前使用srand()
函数设置不同的种子。
srand()
函数:
srand()
函数用于设置rand()
函数生成随机数所使用的种子。srand()
函数需要传递一个整数值作为参数,这个参数被用作生成随机数的种子。- 通过设置不同的种子,可以使得每次运行程序时生成不同的随机数序列。
- 通常,可以使用当前系统时间作为种子值,以确保每次运行程序时都有不同的种子值。例如:
srand((unsigned int)time(NULL))(time函数需要头文件time.h);
注意:
C语言的随机数是伪随机数,是根据特定算法生成的,因此它们在某种程度上是可预测和重复的。如果需要更高质量的随机数或加密级别的随机数,请使用适用于该目的的专用库和函数。
用法:(假设需要生成一个1-100的随机数)
#include<stdio.h> int main() { //随机生成5个1-100的数 srand((unsigned int)time(NULL));//用当前毫秒值来当种子 int num = 0; while (num <= 5) { int x = rand() % 100 + 1; printf("%d\n", x); num++; } return 0; }
为什么要用时间来当种子呢?
我们可以注释掉这一行代码观察:
第一次运行:
再运行一次:
不信邪?再来一次?我们发现如果不设置一个总是变化的种子,无论我们运行多少次,生成的随机数都是一样的。
当然你也可以把种子设置为1,你会发现,种子是1时的随机数顺序总是一样的,种子是2的随机数也总是一样的。就好像是一个教室里的上课学生,只有教室不一样,里面上课的学生才会不一样。
什么东西是总在变化的呢?
时间。时间无时无刻都在变换永远不会重复。所以用当前时间毫秒值来设置为种子,生成的随机数永远跟上一次生成的随机数不一样(某种意义上的不一样),因为时间不一样,种子也就不一样。