Cprogramming 简明教程
Random Number Generation in C
C 中的 stdlib.h 库包括 rand() 函数,该函数返回一个随机整数,介于“0”和常量 RAND_MAX 之间。
rand() 函数生成伪随机数。它们并非真正的随机数。此函数基于线性同余生成器 (LCG) 算法工作。
int rand(void);
Example 1
以下代码调用 rand() 函数三次,每次都会返回一个不同的整数:
#include <stdio.h>
#include<stdlib.h>
int main() {
printf("%ld\n", rand());
printf("%ld\n", rand());
printf("%ld\n", rand());
return 0;
}
Example 2
以下程序返回 0 到 100 之间的随机数。rand() 函数返回的随机整数用作分子,并计算其模 100 值以得到小于 100 的随机数。
#include <stdio.h>
#include<stdlib.h>
int main(){
for(int i = 1; i <= 5; i++) {
printf("random number %d: %d \n", i, rand() % 100);
}
return 0;
}
Example 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 \n", i,num);
}
return 0;
}
The srand() Function
stdlib.h 库还包括 srand() 函数,该函数用于设置 rand() 函数的随机数生成器的种子。
您将使用以下 syntax 来使用 srand() 函数:
void srand (unsigned seed);
或
int srand (unsigned int seed);
seed 参数是一个整数值,将被伪随机数生成器算法用作种子。
Note : 如果 srand() 没有初始化,那么 rand() 函数中的种子值被设置为 srand(1)。
通常,srand() 函数与由 time(NULL) 返回的值(代表从纪元以来的当前时间)一起用作一个参数,以提高 C 中的 rand() 生成的伪随机数的随机性。
由于时间值始终在改变,这将具有不同的种子值,从而导致更多样化的随机序列。结果,如果你多次生成随机数,那么每次都可能导致不同的随机值。
Example 1
请看以下示例:
#include <stdio.h>
#include<stdlib.h>
#include <time.h>
int main() {
srand(time(NULL));
printf("Random number: %d \n", rand());
return 0;
}
每次都将显示 0 到 RAND_MAX 之间的一个新随机整数。
Random number: 1436786055
Example 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 \n", 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)生成随机数。
为了提高随机性,你需要使用具有高度不可预测性的良好种子值,例如系统时间或高分辨率计时器。你还可以使用第三方库来获取更广泛范围的随机数。