天天看點

随機函數random() rand() srand() randomize()

    這幾天在幫朋友開發一個軟體,裡面要産生一些随機數。這裡把我學到的東西總結一下,有些具體的原理是什麼,我也不太清楚,隻知道怎麼用。寫下來,和大家分享,希望對大家有點用,若有不對的地方,希望大家給指出來。

    要産生一個随機數,必須得指定一個随機數種子。指定随機數種子可以通過以下兩個函數來實作---------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;

在這個函數中,可以随機排列兩個數組中的值,且産生的排列順序是不一樣的。

繼續閱讀