程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
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