一直想好好的系統的學習一下c語言的偽隨機數,今天終於逮到機會了
因此上述的srand((unsigned)time(null))
是利用系統時間來初始化隨機種子的。
最後來介紹一下重要的乙個函式rand
rand函式
標頭檔案:
定義函式:int rand(void)
函式功能:產生隨機數
函式說明:因為rand的內部實現是用線性同餘法做的,它不是真的隨機數,只不過是因為其週期特別長,所以,在一定的範圍裡可看成是隨機的。rand()會返回一隨機數值,範圍在0至rand_max 間。在呼叫此函式產生隨機數前,必須先利用srand()設好隨機數種子,如果未設隨機數種子,rand()在呼叫時會自動設隨機數種子為1。
返回值: 返回0至rand_max之間的隨機整數值,rand_max的範圍最少是在32767之間(int),即雙位元組(16位數)。若用unsigned int 雙位元組是65535,四位元組是4294967295的整數範圍。且0-rand_max每個數字被選中的機率是相同的。
rand()產生的是假隨機數字,每次執行時是相同的。若要不同,以不同的值來初始化它.初始化的函式就是srand()。
舉個例子
說白了上述的隨機數範圍是0~32767之間,若沒有設定系統時間種子,則rand預設隨機種子為1,則多次執行結果都是一致的。
當然,若想要乙個給定範圍的隨機數,則需要使用rand()%(b-a+1)+a。顯然rand()%(b-a+1)的範圍是[0,b-a],再加上a即為[a,b]。
舉個例子([0,1]和[3,6]之間的隨機數)
一般來說這個範圍最大是0~32767,若想要生成超過32767的更大的隨機數,則可以採用,移位或者拼湊或者用隨機數除以rand_max,這樣就會得到乙個[0,1]範圍內的浮點數。只需要這個浮點數乘以範圍長度(b-a+1)再加上a即可。即(int)((double)rand()/32767*(b-a+1)+a)
,相當於這個浮點數在[a,b]範圍內的比例位置
舉個例子
ps:介紹乙個簡單的ac技巧,在程式中一次性計算出所有需要用到的結果,然後查詢直接取這些結果,典型的ac技巧有木有(●ˇ∀ˇ●)小結
c語言的偽隨機數適用範圍還是挺廣泛的,下次需要用起來的時候,就不需要再去找什麼資料了。
隨機數 偽隨機數
隨機數 偽隨機數 rand函式在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次呼叫rand函式生成的偽隨機數序列都是一樣的。srand unsigned seed 通過引數seed改變系統提供的種子值,從而可以使得每次呼...
C 偽隨機數
自然界中的有很多不確定的物理現象,通過測量這些現象,就可以獲得真隨機數。比如白雜訊的幅值 電子元器件的電壓雜訊等,真隨機數可以通過用硬體對這些引數進行採集獲得。偽隨機數序列是用確定性的演算法計算出來的週期很長的序列。程式的執行過程是乙個確定的過程,每一條指令都是確定的,因此不能產生真的隨機數。說到偽...
C語言偽隨機數的生成
在stdlib.h中,有兩個函式與偽隨機數的生成有關 srand和rand。c語言中,隨機數表有很多列,srand函式是根據其引數 unsigned型別 來獲得乙個種子 seed 根據種子來設定從哪一列開始取隨機數。rand無引數,返回乙個相應的隨機數。種子相同,則從同一列隨機數中選取,rand每次...