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