程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話頂用於發生隨機數的函數應用辦法總結

C說話頂用於發生隨機數的函數應用辦法總結

編輯:關於C++

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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved