這裡涉及到偽隨機數的概念,什麼是偽隨機數呢?偽隨機數是使用一些稱為種子(seed)的初始值通過某種演算法得到的。這個演算法是確定的,因此產生的數字序列在統計上並非隨機的。只是,假如這個演算法優良,那麼結果得到的數字序列就行通過很多合理的隨機性測試。這些數字通常被稱為偽隨機數(psreudorandom number)。除非你知道演算法和種子,否則就不大能猜測出這個序列[1]。
好了,以下來看一下這句話是什麼意思:
srand(time(null));
先看srand()函式有什麼作用。它是用來設定種子(seed)的,例:srand(n),則n就是你設定的種子。假設每次設定的種子同樣,比方srand(1),那麼相當於不呼叫srand()函式(注意 :假設不顯式呼叫srand()函式,系統僅僅會預設呼叫一次srand(1)函式,即在第乙個rand()函式之前呼叫;執行第2個第3個……rand()之前不會再呼叫srand(1)),那麼接下來你再呼叫rand(),得到的隨機數序列是同樣的,這裡給乙個樣例:
windows 32 console
#include
#include
#include
void main( void )
注意,這個程式中,我把srand( (unsigned)time( null ) )給凝視起來了,所以每次執行該程式時,種子是預設給出的,都是同乙個值,(vc++中預設種子的值為1),既然種子一樣,就像我前面提到的,演算法是一定的,所以每次產生的隨機數序列都是同樣的。在我的電腦上每次執行程式都產生這10個數:
41 所以說這些數是偽隨機數。由於真正的隨機數每次產生時都不應該同樣,包含這個序列也不應該同樣。所以說我們要產生真正的隨機數,就應當在每次呼叫rand()之前設定不同的種子,如何做到這一點呢?使用time(null)。
time(null)返回的是乙個time_t型別的資料,實際上是乙個無符號整型(unsigned int)的資料,在這個32位的無符號數中,高16位存放當前date(年月日)的資訊,低16位存當前放time(時分秒)的資訊。時間是在不斷變化的,所以每次呼叫time(null)返回的值是不同的(當然兩次呼叫的時間間隔大於等於1秒才行,由於time_t中的資訊只精確到秒)
這樣srand(time(null)); 就能夠保證每次都會設定新的 種子,從而再呼叫rand()時會得到不同的隨機數序列:再給個樣例[2]這個樣例不過把前面的樣例多加了一句srand(time(null)); )
windows 32 console
#include
#include
#include
void main( void )
這樣每次執行程式都會得到10個不同的數,而且每次得到的這10個數都是不同的(注意理解我的意思,每次產生的10個數組成的序列不同)。
注意time(null)的作用事實上就是將當前時間儲存到乙個unit中返回,
time_t osbinarytime=time(null);相當於下面**:
ctime t=ctime::getcurrenttime();
time_t osbinarytime=t.gettime();
Cocos2d x 生成真正的隨機數
關於隨機數 cocos2d x 定義了乙個巨集 ccrandom 0 1 生成的是 0,1 之間的值 因此,要生成 0 100 之間的數 ccrandom 0 1 100 生成 1,5 之間的float 數,就是 ccrandom 0 1 4 1 但是這個隨機並不是真正的隨機,你多試幾次就會發現,每...
生成隨機數 js生成隨機數的方法
這幾天一直在研究前台div元素的隨機定位的問題,而這裡面涉及到了js生成隨機數的方法,就下功能研究了一翻,並整理了一些資料以防以後再用得到。在js中可以使用 math 對像來實現隨機數的生成,但是這個對像有幾個方法,先了解一下 1 js中的 ceil 方法 ceil 方法對數字進行四捨五入,向上取整...
隨機生成隨機數
現畫乙個command命令按鈕,進行貼上。private sub command1 click show me scale 0,0 18,8 me.auto redraw true me.draw mode 2 circle 3,4 3,vb red me.auto redraw false lin...