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)生成隨機數。

為了提高隨機性,您需要使用具有高不可預測性的良好種子值,例如系統時間或高解析度計時器。您還可以使用第三方庫來獲得更寬範圍的隨機數。

廣告

© . All rights reserved.