的幾種方式)
一.rand1.rand介紹C語言提供了一個函數(shù)叫rand這函數(shù)是可以生成隨機數(shù)的函數(shù)原型如下所示int rand (void);rand函數(shù)會返回一個偽隨機數(shù)這個隨機數(shù)的范圍是在0~RAND_MAX之間這個RAND_MAX的大小是依賴編譯器上實現(xiàn)的但是大部分編譯器上是32767。2.使用頭文件是#includestdlib.hprintf(“%d\n”, rand());rand()%1001;//%100的余數(shù)是099,099的數(shù)字1,范圍是1~100如果要生成100~200的隨機數(shù)方法如下100 rand()%(200-1001)//余數(shù)的范圍是0100加100后就是100200如果要生成a~b的隨機數(shù)方法如下a rand()%(b-a1)3.說明rand函數(shù)是對一個叫“種子”的基準(zhǔn)值進行運算生成的隨機數(shù)。每次運行程序產(chǎn)生的隨機數(shù)序列是一樣的那是因為rand函數(shù)生成隨機數(shù)的默認(rèn)種子是1。如果要生成不同的隨機數(shù)就要讓種子是變化的。二.srand1.srand介紹C語言中還提供了一個函數(shù)叫srand用來初始化隨機數(shù)的生成器的srand的原型如下void srand (unsigned intseed);程序中在調(diào)用rand函數(shù)之前先調(diào)用srand函數(shù)通過srand函數(shù)的參數(shù)seed來設(shè)置rand函數(shù)生成隨機數(shù)的時候的種子只要種子在變化每次生成的隨機數(shù)序列也就變化起來了。那也就是說給srand的種子是如果是隨機的rand就能生成隨機數(shù)也就是在生成隨機數(shù)的時候又需要一個隨機數(shù)。三.time1.time函數(shù)介紹在程序中我們一般是使用程序運行的時間作為種子因為時間時刻在發(fā)生變化的。在C語言中有一個函數(shù)叫time就可以獲得這個時間time函數(shù)原型如下time_t time (time_t*timer);time函數(shù)會返回當(dāng)前的日歷時間其實返回的是1970年1月1日0時0分0秒到現(xiàn)在程序運行時間之間的差值單位是秒。返回的類型是time_t類型的time_t類型本質(zhì)上其實就是32位或者64位的整型類型。time函數(shù)的參數(shù)timer如果是非NULL的指針的話函數(shù)也會將這個返回的差值放在timer指向的內(nèi)存中帶回去。如果timer是NULL就只返回這個時間的差值。time函數(shù)返回的這個時間差也被叫做時間戳。2.測試代碼頭文件#includetime.h如果只是讓time函數(shù)返回時間戳我們就可以這樣寫time(NULL);//調(diào)用time函數(shù)返回時間戳四.生成隨機數(shù)綜合運用1.用time函數(shù)返回值做為種子然后再生成隨機數(shù)2.代碼如下#includestdio.h#includestdlib.h#includetime.hintmain(){// 設(shè)置種子為當(dāng)前時間srand((unsignedint)time(NULL));// 生成并打印一個隨機數(shù)0到RAND_MAX之間intrandom_numberrand();printf(隨機數(shù)%d\n,random_number);// 生成并打印一個在指定范圍內(nèi)的隨機數(shù)例如1到100之間intmin1,max100;intrangemax-min1;intrandom_numberminrand()%range;printf(1到100之間的隨機數(shù)%d\n,random_number_in_range);return0;}五.產(chǎn)生真隨機數(shù)的幾種方式1.openssl的實現(xiàn)方式基本步驟如下首先會獲取系統(tǒng)提供的真隨機數(shù)源源產(chǎn)生的數(shù)據(jù)是由系統(tǒng)硬件或操作系統(tǒng)的事件例如用戶的鼠標(biāo)移動、鍵盤輸入、硬件噪聲等產(chǎn)生的具有高度的隨機性。這些數(shù)據(jù)放到熵池中然后使用一個偽隨機數(shù)生成器通常是一個加密安全的偽隨機數(shù)生成器來從熵池中生成更多的隨機數(shù)據(jù)。2.linux下產(chǎn)生隨機數(shù)的方法/dev/random設(shè)備是Linux系統(tǒng)中的一個隨機數(shù)發(fā)生器它可以產(chǎn)生高質(zhì)量的隨機數(shù)這些隨機數(shù)可以用于加密、認(rèn)證等安全性要求較高的場景。注意由于/dev/random設(shè)備僅依賴于系統(tǒng)環(huán)境中的熵源如硬件噪聲因此在系統(tǒng)運行初期可能無法立即生成足夠的隨機數(shù)此時讀取操作會阻塞。為了避免長時間阻塞可以使用/dev/urandom設(shè)備該設(shè)備也可以產(chǎn)生隨機數(shù)但不會阻塞當(dāng)熵源不足時會使用偽隨機數(shù)算法來生成數(shù)據(jù)。3.單片機內(nèi)硬件隨機發(fā)生器產(chǎn)生隨機數(shù)有些單片機有內(nèi)部硬件隨機發(fā)生器可以產(chǎn)生真正的隨機數(shù)比如STM32F407 自帶了硬件隨機數(shù)發(fā)生器RNGRNG 處理器是一個以連續(xù)模擬噪聲為基礎(chǔ)的隨機數(shù)發(fā)生器在主機讀數(shù)時提供一個 32 位的隨機數(shù)。