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;