隨機數總結

2021-06-20 17:41:28 字數 2153 閱讀 1451

在計算機中並沒有乙個真正的隨機數發生器,但是可以做到使產生的數字重複率很低,這樣看起來好像是真正的隨機數,實現這一功能的程式叫隨機數發生器。

無論採用什麼數學演算法產生隨機數發生器,都必須給它提供乙個名為「種子」的初始值。而且這個值最好是隨機的,或者至少這個值是偽隨機的。「種子」的值通常是用快速暫存器或移位暫存器來生成的。

現在的c編譯器都提供了乙個基於ansi標準的偽隨機數發生器函式,用來生成隨機數。它們們就是rand()和srand函式。這二個函式的工作過程如下:

1〉 首先給srand()提供乙個unsigned型別的種子,其取值範圍是0-65535(2^16-1);

2〉 然後呼叫rand(),它會根據提供給srand()的種子值返回乙個隨機數(windows下隨機數取值範圍是0-65535,linux下隨機數取值範圍是0-2147483647)

3〉 根據需要多次呼叫rand(),從而不斷地得到新的隨機數

4〉 無論什麼時候,都可以賦予srand乙個新的種子,從而進一步「隨機化」rand的輸出結果。

stdlib.h

void srand(unsigned int seed);
設定rand()產生隨機數時的隨機數種子

stdlib.h

int rand(void);
範圍是0-rand_max(定義在stdlib.h中,值為2147483647)的整數

產生隨機數

a>  沒有利用srand設定隨機數種子,直接呼叫rand,則預設隨機數種子為1,即預設srand(1);

例一:

#include #include #include #define max 100

int main(int argc,char *argv)

輸出結果:

前後兩次輸出結果一樣。

b>  srand常用系統時間或者執行緒id作為引數。

為了防止隨機數每次重複常常使用系統時間來初始化,即使用time

函式來獲得系統時間,然後將time_t型資料轉化為(unsigned)型再傳給srand函式,

即: 

srand((unsigned) time(&t));
還有乙個經常用法,不需要定義time_t型t變數,

即:

srand((unsigned) time(null));
因為time這個函式由於歷史問題,有兩種用法

time(&t); //由t返回時間

或者

t=time(null);

srand((int)getpid());

使用程式的id(

getpid

())來作為初始化種子,在同乙個程式中這個種子是固定的。

c>  可以在程式中的任意位置設定隨機數種子。

例二:

#include#include#includeintmain(int argc,char *argv)

srand((unsigned int)time(0));

printf("the second array:\n");

for(k=0;k<10;k++)

printf("the third array:\n");

for(k=0;k<10;k++)

return 0;

}

輸出結果 :

d>  關於rand_max

linux下rand_max和windows下的rand_max(都是32位作業系統):

window下的rand_max為:0x7fff=2^15-1

linxu下的rand_max為:2^31-1   加上乙個正數最高位就為1=負數,即 - rand_max=rand_max+1所以 - rand()/rand_max=rand()/(rand_max+1)

隨機數 偽隨機數

隨機數 偽隨機數 rand函式在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次呼叫rand函式生成的偽隨機數序列都是一樣的。srand unsigned seed 通過引數seed改變系統提供的種子值,從而可以使得每次呼...

隨機數生成 偽隨機數和真隨機數

c語言隨機數的生成,很隨機,又不隨機,比如像下面的程式 c語言生成隨機數的函式在stdlib.h庫中 include includeint main return 0 上面的 經過執行生成了 41 18467 6334 26500但是無論執行多好遍結果都是一樣的,隨機數並不隨機。這是因為rand 函...

隨機數 科普 真隨機數和偽隨機數

位元幣使用者很喜歡討論 非對稱加密 橢圓曲線 量子計算機 這類高深莫測的話題,然後再以一種非常莫名其妙的方式把幣弄丟,比如說 隨機 隨機很重要,對於位元幣這種密碼學電子貨幣來說,尤其重要。可惜社群內對於隨機的討論並不多,導致很多人缺乏正確的認識,因此,我們今天就和大家聊聊隨機。說到隨機,有兩個必須要...