qt裡產生隨機數

2021-06-22 02:48:10 字數 2440 閱讀 6875

先說一下rand()與srand()這兩個函式的用法

所謂的「偽隨機數」指的並不是假的隨機數,這裡的「偽」是有規律的意思。其實絕對的隨機數只是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機 數。計算機生成的偽隨機數既是隨機的又是有規律的 —— 一部份遵守一定的規律,一部份則不遵守任何規律。比如「世上沒有兩片形狀完全相同的樹葉」,這正點到了事物的特性 —— 規律性;但是每種樹的葉子都有近似的形狀,這正是事物的共性 —— 規律性。從這個角度講,我們就可以接受這樣的事實了:計算機只能產生偽隨機數而不是絕對的隨機數。

c++中的標準庫(包含在中)提供兩個幫助生成偽隨機數的函式:rand()和srand()。

函式一:int rand(void);

從srand(seed)中指定seed開始,返回乙個範圍介於[seed,rand_max(0x7fff))的隨機整數

函式二:void srand(unsigned seed);

引數seed是rand()的隨機種子,即用來初始化rand()的起始值。

系統在呼叫rand()之前都會自動呼叫srand(),如果使用者在rand()之前曾呼叫過srand()給引數seed指定了乙個值,那麼rand ()就會將seed的值作為產生偽隨機數的初始值;而如果使用者在rand()前沒有呼叫過srand(),那麼rand()就會自動呼叫srand (1),即系統預設將1作為偽隨機數的初始值。

由上述可得知,如果希望rand()在每次程式執行時產生的值都不一樣,必須給srand(seed)中的引數seed指定乙個變值,這個變值必須在每次 程式執行時都不一樣(比如到目前為止流逝的時間);如果我們給seed指定的是乙個定值,那麼每次程式執行的時候,rand()產生的隨機數都會一樣,只 不過這個值是[seed,rand_max(0x7fff))範圍中的乙個隨機取得的值。

舉幾個例子說明一下,假設我們要取得0~6之間的隨機數(不包括6本身):

程式一(沒有指定seed的值):

for(int i=0;i<10;i++)

{ran_num=rand()%6;

cout《程式二(指定seed為1):

srand(1);

for(int i=0;i<10;i++)

{ran_num=rand()%6;

cout《程式三(指定seed的值為6):

srand(6);

for(int i=0;i<10;i++)

{ran_num=rand()%6;

cout《程式四(指定seed的值為當前系統流逝了的時間,單位為秒(time_t time(0))):

#include

……srand((unsigned)time(0));

for(int i=0;i<10;i++)

{ran_num=rand()%6;

cout《關於time_t time(0)

time_t 被定義為長整型,它將返回從2023年1月1日零時零分零秒到現在所經歷過的時間,單位為秒。比如輸出 cout《關於ran_num=rand()%6

將rand()的返回值與6求模是必須的,這樣才能確保目的隨機數落在[0,6)之間,否則很可能會得到乙個非常巨大的數值 (rand_max一般為32767)。乙個通用的公式是:要想取得[a,b)之間的隨機整數,使用(rand()%(b-a))+ a,結果包含 a 而不含 b

這裡介紹2種方法

標頭檔案都必須的,不多說了:  #include

其中乙個:

函式中:

qtime t;

t= qtime::currenttime();

qsrand(t.msec()+t.second()*1000);

int n = qrand();

還有乙個簡單方法:

qsrand(time(null));

int n = qrand();

這2句不一定要連著,前邊初始化種子可以在程式開始的時候就初始化。

如果2句連在一起,並且又同時出現在for迴圈中,就容易產生相同的隨機數。

參考zhidao.baidu.com/question/33336870.html

關於srand的說明:(百科)

srand函式是隨機數發生器的初始化函式。

原型:void srand(unsigned seed);   用法:它需要提供乙個種子,如: srand(1); 直接使用1來初始化種子。不過常常使用系統時間來初始化,即使用 time函式來獲得系統時間,它的返回值為從 00:00:00 gmt, january 1, 1970 到現在所持續的秒數,然後將time_t型資料轉化為(unsigned)型再傳給srand函式,即: srand((unsigned) time(&t)); 還有乙個經常用法,不需要定義time_t型t變數,即: srand((unsigned) time(null)); 直接傳入乙個空指標,因為你的程式中往往並不需要經過引數獲得的t資料。srand((int)getpid()); 使用程式的id(getpid())來作為初始化種子,在同乙個程式中這個種子是固定的。

qt裡產生隨機數

本文摘自 先說一下rand 與srand 這兩個函式的用法 所謂的 偽隨機數 指的並不是假的隨機數,這裡的 偽 是有規律的意思。其實絕對的隨機數只是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機 數。計算機生成的偽隨機數既是隨機的又是有規律的 一部份遵守一定的規律,一部份則不遵守任何規律。...

QT 隨機數產生

上 qstring strtem qstring temp int i 0 if temcur 24 temcur 0 tem temcur strtem.mid 2,5 tofloat 轉換 隨機數 i rand 100 strtem qstring number i strtem 27.strt...

產生隨機數

先說明一下rand,這個函式用來產生偽隨機數。比如,產生1000的兩個隨機數,產生的兩個一般上是不同的,但如果要產生80個100以內的隨機數,僅用rand函式就不夠。因為產生80個100以內的隨機數,至少有兩個數相等的概率太大了 srand函式,並不能使產生的隨機數完全不同。你可以執行以下這串 in...