這幾天在幫朋友開發一個軟體,裡面要産生一些随機數。這裡把我學到的東西總結一下,有些具體的原理是什麼,我也不太清楚,隻知道怎麼用。寫下來,和大家分享,希望對大家有點用,若有不對的地方,希望大家給指出來。
要産生一個随機數,必須得指定一個随機數種子。指定随機數種子可以通過以下兩個函數來實作---------randomize()和srand().
randomize():它的功能是初始化随機數發生器。在c++ builder中函數聲明如下:
extern PACKAGE void __fastcall Randomize(void)
其英文描述如下:
Randomize initializes the built-in random number generator with a random value (obtained from the system clock). The random number generator should be initialized by making a call to Randomize, or by assigning a value to RandSeed.
可以看出,randomize()函數是用系統的時間作為随機數種子,初始化随機數發生器的。
srand():它的功能也是初始化随機數發生器。在c++ builder中函數聲明如下:
void srand(unsigned seed)
其英文描述:
Initializes random number generator.
The random number generator is reinitialized by calling srand with an argument value of 1. It can be set to a new starting point by calling srand with a given seed number.
可以看出:srand()是通過參數seed來指定随機數種子的。
指定了随機數種子,我們就可以調用函數 rand()和 random()來産生随機數了。調用它可以傳回一個随機數。rand()函數其定義如下
int rand():調用它将傳回一個0--32767之間的一個int 型數值。
random()函數其定義如下:
int random(int num):調用它可以傳回一個 0---(num-1)之間的一個int 型數值。
若想傳回一個從[a,b)之間的數,可以通過一個通用的公式:
(rand()%(b-a))+a 傳回的數值包含a,包含b。若 a=0,就可以傳回一個 0--b之間的數值。
在實際的應用中,要注意的是:若初始化随機數種子一樣,則它産生的随機數是一樣的。反之,若每次想産生不同的随機數,則必須使每次的随機數種子不一樣才行。
我在實際的應用中,要産生一個随機數隊列,且隊列裡的每一個值則不一樣,其實作方式如下:
void TSelect::GenThesaQue(int NumofThesa,int Top)
{
int ThesaCounter=0,LoopNum,TmpRand;
Randomize();
while(true)
{
TmpRand=random(Top-1) + 1;
for (LoopNum=0;LoopNum if (Thesa_select[LoopNum]==TmpRand)
//産生的随機數已在隊列中則重新循環産生下一個随機數
break;
if (LoopNum>=ThesaCounter)
//無重複,将産生的随機數加入到隊列中
Thesa_select[ThesaCounter++]=TmpRand;
if (ThesaCounter>=NumofThesa)
break;
}
}
函數參數說明:
參數 Top: 随機數資料的上限,如要産生1----16的資料,則Top = 16;
參數 NumofThesa: 産生随機資料的個數。
在程式中 Thesa_Select是一個數組,存儲産生的随機數。
void TSelect:: GenLabelQue(void)
int Que1[4] ={2,4,6,8};
int Que2[4] ={3,5,7,9};
int totel = 4;
int c,i,d=0;
int c_up;
Randomize();
for(;totel>1;totel--)
{
if(totel == 4)
{
c = RandMe(totel);
c_up = c;
}
else if(totel == 3)
Randomize();
srand(c_up);
c = rand()%totel;
else if(totel == 2)
Randomize();
srand(c_up);
c = rand()%totel;
Prim[d++] = Que1[c];
c++;
for(;c Que1[c-1] = Que1[c];
}
Prim[3] = 20 - Prim[0]-Prim[1]-Prim[2];
totel = 4;
d = 0;
c = Select->RandMe(totel);
Thesa[d++] = Que2[c];
for(;c Que2[c-1] = Que2[c];
Thesa[3] = 24 - Thesa[0]-Thesa[1]-Thesa[2];
int TSelect::RandMe(int IntLS)
//IntLS為随機範圍
int RandMeInt;
srand((unsigned)time(NULL));
RandMeInt = rand()%IntLS;
return RandMeInt;
在這個函數中,可以随機排列兩個數組中的值,且産生的排列順序是不一樣的。