標籤:random c
rand函數和srand函數
先我們要對rand&srand有個總體的看法:srand初始化隨機種子,rand產生隨機數,下面將詳細說明。
1、rand(產生隨機數)
表標頭檔: #include<stdlib.h>
定義函數 :int rand(void)
函數說明 :
因為rand的內部實現是用線性同餘法做的,他不是真的隨機數,只不過是因為其周期特別長,所以有一定的範圍裡可看成是隨機的,rand()會返回一隨機數值,範圍在0至RAND_MAX 間。在調用此函數產生隨機數前,必須先利用srand()設好隨機數種子,如果未設隨機數種子,rand()在調用時會自動設隨機數種子為1。rand()產生的是假隨機數字,每次執行時是相同的。若要不同,以不同的值來初始化它.初始化的函數就是srand()。
返回值:
返回0至RAND_MAX之間的隨機整數值,RAND_MAX的範圍最少是在32767之間(int),即雙位元組(16位元)。若用unsigned int 雙位元組是65535,四位元組是4294967295的整數範圍。
0~RAND_MAX每個數字被選中的機率是相同的。
2、srand(設定隨機數種子)
表標頭檔:#include<stdlib.h>
定義函數:void srand (unsigned int seed);
函數說明:
srand()用來設定rand()產生隨機數時的隨機數種子。參數seed必須是個整數,通常可以利用geypid()或time(0)的返回值來當做seed。如果每次seed都設相同值,rand()所產生的隨機數值每次就會一樣。
程式碼範例:(用於產生20個0-100之間的隨機數,若需要產生n~m的數呢?我們只要對rand()進行一些 符號操作就行了;n+rand()%(m-n+1); 即產生m-n之間的隨機數再加上n)
/ crt_rand.c// This program seeds the random-number generator// with the time, then displays 10 random integers.//#include <stdlib.h>#include <stdio.h>#include <time.h>int main( void ){ int i; // Seed the random-number generator with current time so that // the numbers will be different every time we run. // srand( (unsigned)time( NULL ) ); // Display 10 numbers. for( i = 0; i < 20;i++ ) printf( " %6d\n", rand() ); printf("\n"); // Usually, you will want to generate a number in a specific range, // such as 0 to 100, like this: { int RANGE_MIN = 0; int RANGE_MAX = 100; for (i = 0; i < 20; i++ ) { int rand100 = (((double) rand() / (double) RAND_MAX) * (RANGE_MAX-RANGE_MIN) + RANGE_MIN); printf( " %6d\n", rand100); } }
PS:rand()和random()的區別:
int rand(void):返回 0 ------RAND_MAX 之間的一個 int 類型整數,該函數為非安全執行緒函數。並且產生隨機數的效能不是很好,已經不推薦使用
long int random(void):返回 0 ------- RAND_MAX 之間的一個 long 類型整數,該函數會產生一個非常大的隨機值,最大為 16*((2**31)-1)。random 函數使用非線性反饋隨機數發生器產生預設大小為31個長整數表所返回的連續偽隨機數。
如果你使用 srandom 種植種子, 則你應該使用 random 返回隨機數, 如果你使用 srand 種植種子, 則你應該使用rand返回隨機數。
srand和rand官方已經不推薦使用。原因是產生隨機數的效能不是很好, 另外是隨機數的隨機性沒有random好, 再者就是不是安全執行緒。
C中的rand函數和srand函數