欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言中用于產生隨機數(shù)的函數(shù)使用方法總結

 更新時間:2016年05月07日 15:33:55   作者:靈犀  
這篇文章主要介紹了C語言中用于產生隨機數(shù)的函數(shù)使用方法總結,分別介紹了rand()函數(shù)和srand()函數(shù)以及封裝出的arc4random()函數(shù),需要的朋友可以參考下

在UNIX操作系統(tǒng)和window的操作系統(tǒng)上,我們知道有一個函數(shù)rand,它就是用來產生隨機數(shù)的函數(shù)API接口,那么它的原理如何實現(xiàn)?
如果約定a1=f(seed),an+1=f(an),那么可以得到一個序列a1,a2,a3..an,那么要制作一個偽隨機函數(shù)rand,只需要讓它每調用一次就返回序列的下一個元素就行。其實就是相當于第1次調用rand返回a1,第2次返回a2,…,第n次返回an,這樣每次返回的數(shù)值都不一樣,也就是相當于隨機數(shù)了。但是其實不是真正的隨機數(shù),真正的隨機數(shù)是使用物理現(xiàn)象產生的:比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等等。這樣的隨機數(shù)發(fā)生器叫做物理性隨機數(shù)發(fā)生器,它們的缺點是技術要求比較高。那到底什么是隨機數(shù)呢?

隨機數(shù):隨機數(shù)就是每次運行代碼的時候隨機產生的數(shù),每次產生的數(shù)的值是無法確定的,返回 0 到 RANDMAX 之間的隨機整數(shù)值,不包含 RANDMAX 的值,RANDMAX 的范圍最少是在32767之間(int),即雙字節(jié)(16位數(shù))。若用 unsigned int 雙字節(jié)是65535,四字節(jié)是4294967295的整數(shù)范圍。而且 0 到 RANDMAX 每個數(shù)字被選中的概率是相同的。

原理:產生隨機數(shù)的原理是根據(jù)一個值,一般稱為隨機種子,然后把這個種子作為參數(shù),經過一系列的公式運算產生出一個值,這個值就是隨機數(shù)。

在 C 語言當中使用隨機數(shù)要用到 rand 函數(shù)和 srand 函數(shù),

int rand():返回值為隨機值,參數(shù)為空,通過 rand 函數(shù)就會產生一個隨機數(shù)。

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;
}

每次運行的結果都一樣,這是為什么呢?上面已經說了,隨機數(shù)產生的是有一個隨機種子作為參數(shù),然后返回一個值,而且默認的隨機種子為1,所以每次產生的隨機數(shù)都一樣。

如果我們修改一下隨機種子,會發(fā)現(xiàn)隨機數(shù)和原來的不一樣了,但是每次運行的結果還是一樣:

#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 函數(shù)必須引入 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 的隨機值,公式是什么呢?因為隨機數(shù)取余法只能返回 0 到某個數(shù)的隨機值,所以 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 的隨機值

大家現(xiàn)在做這樣的操作:

#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;
}

既然隨機種子一樣,為什么輸出結果不一樣呢?這里得注意一下,如果程序沒有結束,而且也沒有重新設置過隨機種子,那么系統(tǒng)會把上次的隨機值作為下次隨機函數(shù)的隨機種子,因此在上面的 for 循環(huán)當中,其實每次的循環(huán)種子都不一樣,怎么驗證呢?先看我這里的輸出結果為:

rand_num = 33614

rand_num = 564950498

rand_num = 1097816499

rand_num = 1969887316

rand_num = 140734213

我們可以把隨機種子設置成其中的一個 rand_num 值,比如 33614,那么輸出結果如果為 564950498 的話,那么說明在 for 循環(huán)中每次都把隨機值作為下次的隨機函數(shù)的隨機種子了。

srand(33614);
int rand_num = rand();
printf("rand_num = %d\n", rand_num);

結果:

rand_num = 564950498;

驗證完畢。

arc4random() 函數(shù):

這個函數(shù)是 C 語言封裝的一個比較智能的隨機函數(shù),我們只要調用這個函數(shù),就會產生隨機數(shù),不用設置隨機種子,而且用法很簡單:

int arc_rand = arc4random();
printf("arc_rand = %d\n", arc_rand);

每次的運行結果都不一樣。如果要產生 a ~ b 的隨機值,公式也是:

arc4random() % (b - a + 1) + a;

相關文章

  • C++/JAVA/C#子類調用父類函數(shù)情況總結

    C++/JAVA/C#子類調用父類函數(shù)情況總結

    今天小編就為大家分享一篇關于C++/JAVA/C#子類調用父類函數(shù)情況總結,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 淺談關于指針作為參數(shù)并改變它的值的問題

    淺談關于指針作為參數(shù)并改變它的值的問題

    這篇文章介紹了關于指針作為參數(shù)并改變它的值的問題,有需要的朋友可以參考一下
    2013-10-10
  • C語言大作業(yè)之圖書管理系統(tǒng)的實現(xiàn)詳程

    C語言大作業(yè)之圖書管理系統(tǒng)的實現(xiàn)詳程

    隨著網(wǎng)絡技術的高速發(fā)展,計算機應用的普及,利用計算機對圖書館的日常工作進行管理勢在必行,趁著寒假時間手把手帶你用C語言實現(xiàn)一個圖書管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2022-01-01
  • C++ invoke與function的區(qū)別解析

    C++ invoke與function的區(qū)別解析

    invoke函數(shù)的實現(xiàn)原理是通過使用SFINAE(Substitution Failure Is Not An Error)技術來判斷可調用對象的類型,并根據(jù)類型調用對應的調用方式,這篇文章主要介紹了C++ invoke與function的區(qū)別,需要的朋友可以參考下
    2023-10-10
  • C++設計模式編程中Template Method模板方法模式的運用

    C++設計模式編程中Template Method模板方法模式的運用

    這篇文章主要介紹了C++設計模式編程中Template Method模板方法模式的運用,講到了包括模板方法模式中的細分方法以及適用場景,需要的朋友可以參考下
    2016-03-03
  • C語言實現(xiàn)簡易版掃雷的完整過程

    C語言實現(xiàn)簡易版掃雷的完整過程

    這篇文章主要給大家介紹了關于利用C語言如何實現(xiàn)簡易版掃雷的完整過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • C++學習之移動語義與智能指針詳解

    C++學習之移動語義與智能指針詳解

    智能指針和移動語義是迄今為止,最難理解的兩個概念,下面這篇文章主要給大家介紹了關于C++學習之移動語義與智能指針的相關資料,需要的朋友可以參考下
    2021-05-05
  • 使用c++實現(xiàn)異或加密的代碼示例

    使用c++實現(xiàn)異或加密的代碼示例

    這篇文章主要為大家介紹了c++實現(xiàn)異或加密的代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • C語言多種獲取字符串長度的方法

    C語言多種獲取字符串長度的方法

    這篇文章主要介紹了C語言多種獲取字符串長度的方法,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C/C++多參數(shù)函數(shù)參數(shù)的計算順序與壓棧順序的示例代碼

    C/C++多參數(shù)函數(shù)參數(shù)的計算順序與壓棧順序的示例代碼

    這篇文章主要介紹了C/C++多參數(shù)函數(shù)參數(shù)的計算順序與壓棧順序,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06

最新評論