C 偽隨機數

2021-10-09 12:39:43 字數 1485 閱讀 6794

自然界中的有很多不確定的物理現象,通過測量這些現象,就可以獲得真隨機數。比如白雜訊的幅值、電子元器件的電壓雜訊等,真隨機數可以通過用硬體對這些引數進行採集獲得。

偽隨機數序列是用確定性的演算法計算出來的週期很長的序列。程式的執行過程是乙個確定的過程,每一條指令都是確定的,因此不能產生真的隨機數。

說到偽隨機數就會說到種子,什麼是種子呢,我們可以將種子理解為乙個初始值,特定演算法根據這個初始值產生乙個一定的序列,生成的這個序列「看起來」是隨機的,實際上是乙個週期很長的確定序列。如果每次的種子設定得相同,那麼產生的序列都是相同的。

舉個例子,我們可以簡單的設定這個種子為某個數,比如1。請看如下**,用srand()設定種子的值,用rand()產生偽隨機數序列,需要包含標頭檔案#include。重複執行下列**,因為種子相同,所以每次輸出的序列都是如圖的序列"41 18467 6334 26500 …"。

srand(1

);// 設定種子的值為1,如果不設定,預設種子為1

可以用c語言中的庫函式time_t time(time_t *seconds)返回自1970-01-01 00:00:00 utc 起經過的時間,以秒為單位。這個函式的入參seconds也能儲存結果,請看如下**,輸出的t和seconds的值是一樣的。

time_t seconds;

time_t t=

time

(&seconds)

; cout << t <<

" "<< seconds <

// t和seconds的值是一樣的

那麼,我們將當前的時間設定為種子,由於時間一直在變,種子就一直在變,每次就能生成不同的偽隨機數序列。

time_t t=

time

(nullptr);

srand

(t);

// 設定種子的值為時間

for(

int i =

0; i <10;

++i)

題目:將1-100的有序序列變成無序序列,要求每次執行的結果不同。

// 題目:將1-100的有序序列變成無序序列,要求每次執行的結果不同。

void

fun(vector<

int>

&vec)

}int

main()

fun(vec)

;for

(auto it : vec)

cout << endl;

system

("pause");

}

隨機數 偽隨機數

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

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

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

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

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