想要生成不同的随机数,我们就需要用到以下三个函数
1. rand()
功能:rand()函数用于生成伪随机数。它会返回一个介于0到RAND_MAX之间的整数(RAND_MAX是一个常量,通常为32767)。
问题:rand()生成的随机数是伪随机的,即每次程序运行时,如果不进行种子初始化,它会生成相同的随机数序列。这是因为rand()的内部实现是基于一个固定的算法和初始种子值(默认为1)。
2.srand()
功能:srand()函数用于设置随机数生成的种子值。它的参数是一个unsigned int类型的值。
作用:通过调用srand()并传入一个不同的种子值,可以改变rand()生成的随机数序列。如果每次都使用相同的种子值,rand()会生成相同的随机数序列;如果使用不同的种子值,rand()会生成不同的随机数序列。
重要性:为了使程序每次运行时都能生成不同的随机数序列,通常需要在程序开始时调用srand()来设置一个不同的种子值。
注意:srand函数是不需要频繁调⽤的,⼀次运⾏的程序中调⽤⼀次就够了
-
时间精度问题:通常使用
time(NULL)
作为种子值,其返回值的精度是秒级的。如果在短时间内多次调用srand(time(NULL))
,可能会得到相同的种子值,从而导致生成的随机数序列相同。 -
循环中的问题:如果将
srand
放在循环中频繁调用,例如在每次生成随机数前都调用srand
,可能会因为循环运行速度过快而导致time(NULL)
返回相同的时间值,从而使得随机数生成器始终使用相同的种子,最终生成相同的随机数
3. time()
功能:time()函数用于获取当前时间。它的返回值是一个time_t类型的值,表示从1970年1月1日00:00:00 UTC到当前时间的秒数。
与rand()和srand()的关系:time()通常被用作srand()的参数,以生成一个不同的种子值。因为每次程序运行时,当前时间都会不同,所以使用time(NULL)作为种子值可以确保每次运行程序时rand()都能生成不同的随机数序列。
4. 三者的结合使用
为了生成不同的随机数序列,通常会这样使用这三个函数:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
// 使用当前时间作为种子值
srand((unsigned int)time(NULL));
// 生成随机数
int random_number = rand();
printf("Random number: %d\n", random_number);
return 0;
}
解释:
time(NULL)获取当前时间。
srand((unsigned int)time(NULL))将当前时间转换为unsigned int类型,并作为种子值传递给srand()。
rand()根据这个种子值生成一个随机数。
5. 总结
rand用于生成伪随机数。
srand用于设置随机数生成的种子值。
time用于获取当前时间,常被用作srand的参数,以确保每次运行程序时都能生成不同的随机数序列。
三者结合使用,可以实现每次运行程序时生成不同的随机数序列,从而满足实际应用中对随机数的需求。