怎樣產生隨機數

2021-04-13 02:56:48 字數 1962 閱讀 1070

問:怎樣產生隨機數?

答: 在計算機中並沒有乙個真正的隨機數發生器,但是可以做到使產生的數字重複率很低,這樣看起來好象是真正的隨機數,實現這一功能的程式叫偽隨機數發生器。

有關如何產生隨機數的理論有許多,如果要詳細地討論,需要厚厚的一本書的篇幅。不管用什麼方法實現隨機數發生器,都必須給它提供乙個名為「種子」的初始值。而且這個值最好是隨機的,或者至少這個值是偽隨機的。「種子」的值通常是用快速計數暫存器或移位暫存器來生成的。

下面講一講在c語言裡所提供的隨機數發生器的用法。現在的c編譯器都提供了乙個基於ansi標準的偽隨機數發生器函式,用來生成隨機數。它們就是rand()和srand()函式。這二個函式的工作過程如下:

1) 首先給srand()提供乙個種子,它是乙個unsigned int型別,其取值範圍從0~65535;

2) 然後呼叫rand(),它會根據提供給srand()的種子值返回乙個隨機數(在0到32767之間)

3) 根據需要多次呼叫rand(),從而不間斷地得到新的隨機數;

4) 無論什麼時候,都可以給srand()提供乙個新的種子,從而進一步「隨機化」rand()的輸出結果。

這個過程看起來很簡單,問題是如果你每次呼叫srand()時都提供相同的種子值,那麼,你將會得到相同的隨機數序列,這時看到的現象是沒有隨機數,而每一次的數都是一樣的了。例如,在以17為種子值呼叫srand()之後,在首次呼叫rand()時,得到隨機數94。在第二次和第三次呼叫rand()時將分別得到26602和30017,這些數看上去是很隨機的(儘管這只是乙個很小的資料點集合),但是,在你再次以17為種子值呼叫srand()後,在對於rand()的前三次呼叫中,所得的返回值仍然是在對94,26602,30017,並且此後得到的返回值仍然是在對rand()的第一批呼叫中所得到的其餘的返回值。因此只有再次給srand()提供乙個隨機的種子值,才能再次得到乙個隨機數。

下面的例子用一種簡單而有效的方法來產生乙個相當隨機的「種子」值----當天的時間值:

#include

#include

#include

#include

void main(void)

上面的程式先是呼叫_ftime()來檢查當前時間,並把它的值存入結構成員timebuf.time中,當前時間的值從2023年1月1日開始以秒計算。在呼叫了_ftime()之後,在結構timebuf的成員millitm中還存入了當前那一秒已經度過的毫秒數,但在dos中這個數字實際上是以百分之一秒來計算的。然後,把毫秒數和秒數相加,再和毫秒數進行異或運算。當然也可以對這兩個結構成員進行更多的計算,以控制seedval的取值範圍,並進一步加強它的隨機性,但上例用的邏輯運算就已經足夠了。

注意上例中rand()的輸出並沒有被限制在乙個指定的範圍,假定要建立乙個彩票選號器,其取值範圍是從1到44。可以簡單地忽略掉rand()所輸出的在該範圍外的值,但這將花費許多時間去得到所需的全部(例如6個)彩票號碼。假如你已經建立了乙個隨機數發生器,它所產生的隨機數範圍是從0到32767,而你想把輸出限制在1到44之間。下面的例子就說明了如何來完成這項工作:

int i,k range;

int min,max;

double j;

min=1;

max=44;

range=max-min;

i=rand();

j=((oduble)i/(double)rand_max);

i=(int)(j*(double)range);

i =min;

這個例子把輸出的隨機數限制在1到44之間,其工作原理如下:

1)得到乙個在0到rand_max(32767)之間的隨機數,把它除以rand_max,從而產生乙個在0到1之間的校正值;

2)把校正值乘以所需要的範圍值(在本例中為43,即44-1)從而產生乙個在0到43之間的值

3) 把該值和所要求的最小值相加,從而使該值最終落在正確的取值範圍----1到44之間。你可以用不同的min和max值來驗證這個例子,你會發現它總是會正確地產生在新的min和max值之間的隨機數。

C C 中怎樣產生隨機數

c c 怎樣產生隨機數 這裡要用到的是rand 函式,srand 函式,c c 裡沒有自帶的random int number 函式。1 如果你只要產生隨機數而不需要設定範圍的話,你只要用rand 就可以了 rand 會返回一隨機數值,範圍在0至rand max 間。rand max定義在stdli...

C C 中怎樣產生隨機數

c語言 c 怎樣產生隨機數 這裡要用到的是rand 函式,srand 函式,c語言 c 裡沒有自帶的random int number 函式。1 如果你只要產生隨機數而不需要設定範圍的話,你只要用rand 就可以了 rand 會返回一隨機數值,範圍在0至rand max 間。rand max定義在s...

C語言 怎樣產生隨機數

include rand 函式是按指定的順序來產生整數,因此每次執行上面的語句都列印相同的兩個值,所以說c語言的隨機並不是真正意義上的隨機,有時候也叫偽隨機數,使用 rand 生成隨機數之前需要用隨機發生器的初始化函式 srand unsigned seed 也位於 stdlib.h 中 進行偽隨機...