C 语言随机数生成
C 语言的 stdlib.h 库包含 rand() 函数,该函数随机返回一个介于 0 和常量 RAND_MAX 之间的整数。
rand() 函数生成的是伪随机数,并非真正随机。该函数基于线性同余生成器 (LCG) 算法。
int rand(void);
示例 1
以下代码调用 rand() 函数三次,每次可能返回不同的整数 -
#include <stdio.h> #include<stdlib.h> int main() { printf("%ld ", rand()); printf("%ld ", rand()); printf("%ld ", rand()); return 0; }
输出
运行代码并检查其输出 −
41 18467 6334
rand() 函数没有内置设置种子的机制。默认情况下,它可能会使用系统特定值(通常基于程序启动时间)。
注意:srand() 函数用于通过为 rand() 函数提供种子来提高随机性。
示例 2
以下程序返回一个介于 0 到 100 之间的随机数。rand() 函数返回的随机整数用作分子,并将其与 100 进行 mod 运算,得出一个小于 100 的随机数。
#include <stdio.h> #include<stdlib.h> int main(){ for(int i = 1; i <= 5; i++) { printf("random number %d: %d ", i, rand() % 100); } return 0; }
输出
运行代码并检查其输出 −
random number 1: 41 random number 2: 67 random number 3: 34 random number 4: 0 random number 5: 69
示例 3
您也可以获取给定范围内的随机数。您需要将 rand() 的结果除以范围跨度,然后取模值,并将结果添加到给定范围内的较低值。
#include <stdio.h> #include<stdlib.h> int main() { int i, num; int lower=50, upper=100; for (i = 1; i <= 5; i++) { num = (rand() % (upper - lower + 1)) + lower; printf("random number %d: %d ", i,num); } return 0; }
输出
运行代码并检查其输出 −
random number 1: 91 random number 2: 55 random number 3: 60 random number 4: 81 random number 5: 94
srand() 函数
stdlib.h 库还包含 srand() 函数,用于为 rand() 函数随机数生成器提供种子。
您可以使用以下语法来使用 srand() 函数 -
void srand (unsigned seed);
或
int srand (unsigned int seed);
seed 参数是一个整数值,用作伪随机数生成器算法的种子。
注意:如果 srand() 未初始化,则 rand() 函数中的种子值将设置为 srand(1)。
通常,srand() 函数与 time(NULL) 返回的值(表示自纪元以来的当前时间)一起使用,以提高 C 语言中 rand() 生成的伪随机数的随机性。
由于时间值一直在变化,因此种子值也会不同,从而产生更多变化的随机序列。因此,如果多次生成随机数,则每次生成的随机值都可能不同。
示例 1
请看以下示例 -
#include <stdio.h> #include<stdlib.h> #include <time.h> int main() { srand(time(NULL)); printf("随机数: %d ", rand()); return 0; }
输出
每次都会显示一个介于 0 到 RAND_MAX 之间的新随机整数。
随机数:1436786055
示例 2
我们可以包含 srand() 函数来生成给定范围内的随机数。
#include <stdio.h> #include<stdlib.h> #include <time.h> int main() { int i, num; time_t t; int lower = 100, upper = 200; srand((unsigned) time(&t)); for (i = 1; i <=5; i++) { num = (rand() % (upper - lower + 1)) + lower; printf("random number number %d: %d ", i, num); } return 0; }
输出
运行代码并检查其输出 −
random number number 1: 147 random number number 2: 171 random number number 3: 173 random number number 4: 112 random number number 5: 181
rand() 函数提供的随机数生成并非真正随机。使用相同的种子,您始终会得到相同的序列。它生成的随机数范围有限,因为它会限制在特定范围内(0 到 RAND_MAX)。
为了提高随机性,您需要使用具有高不可预测性的种子值,例如系统时间或高精度计时器。您也可以使用第三方库来获取范围更广的随机数。