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\n", rand());
   printf("%ld\n", rand());
   printf("%ld\n", rand());

   return 0;
}

输出

运行代码并检查其输出:

41
18467
6334

rand()函数没有内置的设置种子的机制。默认情况下,它可能会使用特定于系统的值(通常基于程序启动的时间)。

注意srand()函数用于通过向rand()函数提供种子来提高随机性。

示例 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;
}

输出

运行代码并检查其输出:

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 \n", 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("Random number: %d \n", rand());
   
   return 0;
}

输出

每次都会显示0到RAND_MAX之间的新的随机整数。

Random number: 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 \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)生成随机数。

为了提高随机性,您需要使用具有高不可预测性的良好种子值,例如系统时间或高分辨率计时器。您还可以使用第三方库来获得更宽范围的随机数。

广告