1. 程式人生 > >OpenCV中的隨機數與隨機種子

OpenCV中的隨機數與隨機種子

我們先從在C/C++中的隨機數與隨機種子說起。

rand()、srand()

rand()可以生成一個0~RAND_MAX之間的一個隨機數,返回值是一個unsigned int型別值。rand函式不是真正的隨機數生成器,而srand()會設定供rand()使用的隨機數種子。如果你在第一次呼叫rand()之前沒有呼叫srand(),那麼系統會為你自動呼叫srand()。而使用同種子相同的數呼叫 rand()會導致相同的隨機數序列被生成。

srand函式是隨機數發生器的初始化函式。原型:void srand(unsigned int seed);srand和rand()配合使用產生偽隨機數序列。

而如果使用者在rand()前沒有呼叫過srand(),那麼系統預設將1作為偽隨機數的初始 值。如果給了一個定值,那麼每次rand()產生的隨機數序列都是一樣的。

所以為了避免上述情況的發生我們通常用srand((unsigned)time(0))或者srand((unsigned)time(NULL))來 產生種子。如果仍然覺得時間間隔太小,可以在(unsigned)time(0)或者(unsigned)time(NULL)後面乘上某個合適的整數。例如,srand((unsigned)time(NULL)*10)另外,關於time_t time(0):time_t被定義為長整型,它返回從1970年1月1日零時零分零秒到目前為止所經過的時間,單位為秒。NULL的值就是0。規定0可以賦值給任意指標,除0以外的任何數值都不能賦值給指標。

關於time函式介紹如下。

time()

time() 是指返回自 Unix 紀元(January 1 1970 00:00:00 GMT)起的當前時間的總秒數的函式,主要用來獲取當前的系統時間,返回的結果是一個time_t型別。

time_t time(time_t *t);

如果t是空指標,直接返回當前時間。如果t不是空指標,返回當前時間的同時,將返回值賦予t指向的記憶體空間。

有了以上的知識介紹,我們就可以順利地過渡到OpenCV。

在OpenCV中,有個RNG類,用它來產生隨機數。可以使用RNG的建構函式,來建立隨機數生成器的物件。程式碼如下:

RNG rng(12345);  //指定隨機種子位12345

固定的隨機種子,從而產生固定的隨機數序列。那麼如何讓每次生成的隨機數序列是不一樣的呢?

沒錯,就是使用C/C++中相同的思路,使用系統時間(1970年1月1日零時零分零秒,到目前為止所經歷德 總秒數)來作為隨機種子。程式碼如下:

RNG rng((unsigned)time(NULL));  //NULL寫成0是一樣的,NULL就是0

uniform()

關於RNG類,再提到一個它的函式,uinform()

uniform:指定了一個在a和b範圍的均勻分佈的隨機數

rng.uniform(1,255); //返回一個在1~255範圍內的隨機數

例如在顏色隨機上的應用。

Scalar color = Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)); //任意值