Linux 獲取隨機數

2021-06-20 04:12:47 字數 1099 閱讀 2348

- 偽隨機法 

偽隨機法就是通過乙個確定性的演算法來獲取看似隨機或者亂序,在計算偽隨機序列時,如果使用的開始值不變化的,實際上獲取到的隨機序列的值順序是保持不變。例如在c中比較常用的隨機函式rand(),是比較典型的偽隨機法。

在呼叫rand()函式時,沒有顯示的呼叫srand()函式來設定隨機序列開始種子的話,預設隨機序列的種子即為1,此時的隨機序列為:1804289383

846930886、1681692777、1714636915、1957747793、424238335、719885386、1649760492。

rand()函式是實現在glibc庫中,執行於使用者態,執行效率比較高效;

-  真隨機法 

真隨機法,在在計算機環境中,主要是依賴於計算機環境中的背景操作,例如來自驅動程式或者其他**的背景雜訊。真隨即法具有不可**和再現性,原因在於產生隨機數的作業系統所處的環境充滿了未知性。在linux中,/dev/random產生的是真正的隨機數序列。

隨機函式發生器通過驅動程式或者其他**來獲取環境雜訊來計算出乙個隨機數,同時將產生的隨機數放入到隨機數池中,每次需要隨機數時,從池中獲取乙個資料數即可,如果隨機池已空,從/dev/random讀取資料時,將會被阻塞,直到新的隨機數被放入到池中才會返回,這個地方無疑是個巨大的坑,當面對大量的請求需要隨機數時。

/dev/unrandom,也是從隨機池中獲取乙個隨機數,與/dev/random的區別點在於隨機池為空時,隨機數的程度不夠高。

呼叫/dev/(u)random獲取隨機數的方法,相比rand()方法效率會低很多,每獲取一次random值,均需要發起一次系統呼叫,來呼叫該值。

示例**為:

file *fs_p = null; 

fs_p = fopen ("/dev/urandom", "r");

fread(&seed, sizeof(int), 1, fs_p);  //obtain oneunsigned int data  

fclose(fs_p);

針對這段**計算分析,會大量大量的計算效能消耗於核心態:        

獲取隨機數

c 中提供了隨機數函式rand 但是這個函式其實提供的數字是有限的,大概是0 32767,所以這就導致了兩個問題 1 獲取的的數字並不是隨機的,比如要取0 99的隨機數,那麼一般就是rand 100,由於32767 100 67,所以0 67的數字獲得到的次數會比68 99多一次。2 無法獲取到比3...

php 獲取隨機數

獲得最小和最大值之間隨機數,位數不足補零 function getrandnumber fmin fmax fileid date ymd his rand 100,999 fileid為 20100903 132121 908 這樣的的隨機數 function randomkeys length ...

PHP獲取隨機數

fileid date ymd his rand 100,999 fileid為 20100903 132121 908 這樣的的隨機數 function randomkeys length 生成php隨機數 return key echo randomkeys 4 seed使用者自定義函式以微秒作...