C說話頂用於發生隨機數的函數應用辦法總結。本站提示廣大學習愛好者:(C說話頂用於發生隨機數的函數應用辦法總結)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話頂用於發生隨機數的函數應用辦法總結正文
在UNIX操作體系和window的操作體系上,我們曉得有一個函數rand,它就是用來發生隨機數的函數API接口,那末它的道理若何完成?
假如商定a1=f(seed),an+1=f(an),那末可以獲得一個序列a1,a2,a3..an,那末要制造一個偽隨機函數rand,只須要讓它每挪用一次就前往序列的下一個元素就行。其實就是相當於第1次挪用rand前往a1,第2次前往a2,…,第n次前往an,如許每次前往的數值都紛歧樣,也就是相當於隨機數了。然則其實不是真實的隨機數,真實的隨機數是應用物理景象發生的:好比擲貨幣、骰子、轉輪、應用電子元件的樂音、核裂變等等。如許的隨機數產生器叫做物感性隨機數產生器,它們的缺陷是技巧請求比擬高。那究竟甚麼是隨機數呢?
隨機數:隨機數就是每次運轉代碼的時刻隨機發生的數,每次發生的數的值是沒法肯定的,前往 0 到 RANDMAX 之間的隨機整數值,不包括 RANDMAX 的值,RANDMAX 的規模起碼是在32767之間(int),即雙字節(16位數)。若用 unsigned int 雙字節是65535,四字節是4294967295的整數規模。並且 0 到 RANDMAX 每一個數字被選中的幾率是雷同的。
道理:發生隨機數的道理是依據一個值,普通稱為隨機種子,然後把這個種子作為參數,經由一系列的公式運算發生出一個值,這個值就是隨機數。
在 C 說話傍邊應用隨機數要用到 rand 函數和 srand 函數,
int rand():前往值為隨機值,參數為空,經由過程 rand 函數就會發生一個隨機數。
void srand(unsigned int seed):前往值為空, 就是設置隨機種子的,當我們不設置隨機種子的時刻,默許設置的種子為 1,也就是srand(1)。
應用:
#include<stdlib.h>//得引入 stdlib.h 這個頭文件 int main() { int rand_num = rand(); printf("rand_num = %d\n", rand_num); return 0; }
每次運轉的成果都一樣,這是為何呢?下面曾經說了,隨機數發生的是有一個隨機種子作為參數,然後前往一個值,並且默許的隨機種子為1,所以每次發生的隨機數都一樣。
假如我們修正一下隨機種子,會發明隨機數和本來的紛歧樣了,然則每次運轉的成果照樣一樣:
#include<stdlib.h>//得引入 stdlib.h 這個頭文件 int main() { srand(3); int rand_num = rand(); printf("rand_num = %d\n", rand_num); srand(5); rand_num = rand(); printf("rand_num = %d\n", rand_num); return 0; }
兩次的輸入成果紛歧樣,我的輸入成果以下:
rand_num = 50421 rand_num = 847425747
然則我們法式確定是寫好以後,不修改隨機種子,然後每次發生分歧的值才對啊,那我們來若何做呢?既然發生的隨機值與種子有關,只需每次的隨機種子紛歧樣,那末發生的隨機值也紛歧樣,我們便可以把時光作為隨機種子,由於每次運轉時,時光都紛歧樣,是以發生的隨機值也紛歧樣,是以我們可以如許:
#include<time.h> //應用 time 函數必需引入 time.h 頭文件 #include<stdlib.h> int main() { srand((int)time(0)); int rand_num = rand(); printf("rand_num = %d\n", rand_num); return 0; }
如許的話,每次輸入成果都紛歧樣了。
經由過程下面的辦法,我們可以獲得分歧的隨機值了,然則我們普通會獲得必定規模內的隨機值,好比前往 0~100 之間的前往值,好比模仿骰子,隨機前往 1~6 的值。那末我們該若何做呢?
我們要前往 0~6 的隨機值,只需在下面前往隨機值的處所對 7 取余便可:
int rand_num = rand() % 7; printf("rand_num = %d\n", rand_num);
所以我們假如要前往 0~a 的隨機值,只需對 a + 1 取余便可,所以有上面的公式:
int rand_num = rand() % (a + 1);//前往 0 ~ a 的隨機值
假如我們要前往 a ~ b 的隨機值,公式是甚麼呢?由於隨機數取余法只能前往 0 到某個數的隨機值,所以 a ~ b 的隨機值,我們可以先前往 0 ~ (b – a)的隨機值,然後再加上 a 便可:
int rand_num = rand() % (b - a + 1);//1、前往 0 ~ (b - a)的隨機值 rand_num = rand_num + a; //2、前往 a ~ b 的隨機值
是以下面的 1 和 2 歸並以後的公式為:
int rand_num = rand() % (b - a + 1) + a;//前往 a ~ b 的隨機值
年夜家如今做如許的操作:
#include<stdlib.h> int main() { srand(2);//隨機種子固定為2 for(int i = 0; i < 5; i++) { int rand_num = rand(); printf("rand_num = %d\n", rand_num);//留意輸入成果 } return 0; }
既然隨機種子一樣,為何輸入成果紛歧樣呢?這裡得留意一下,假如法式沒有停止,並且也沒有從新設置過隨機種子,那末體系會把前次的隨機值作為下次隨機函數的隨機種子,是以在下面的 for 輪回傍邊,其實每次的輪回種子都紛歧樣,怎樣驗證呢?先看我這裡的輸入成果為:
rand_num = 33614 rand_num = 564950498 rand_num = 1097816499 rand_num = 1969887316 rand_num = 140734213
我們可以把隨機種子設置成個中的一個 rand_num 值,好比 33614,那末輸入成果假如為 564950498 的話,那末解釋在 for 輪回中每次都把隨機值作為下次的隨機函數的隨機種子了。
srand(33614); int rand_num = rand(); printf("rand_num = %d\n", rand_num);
成果:
rand_num = 564950498;
驗證終了。
arc4random() 函數:
這個函數是 C 說話封裝的一個比擬智能的隨機函數,我們只需挪用這個函數,就會發生隨機數,不消設置隨機種子,並且用法很簡略:
int arc_rand = arc4random(); printf("arc_rand = %d\n", arc_rand);
每次的運轉成果都紛歧樣。假如要發生 a ~ b 的隨機值,公式也是:
arc4random() % (b - a + 1) + a;