閱讀678 返回首頁    go 技術社區[雲棲]


C#隨機數的使用

隨機數的使用很普遍,可用它隨機顯示圖片,用它防止無聊的人在論壇灌水還可以用來加密信息等等。本文討論如何在一段數字區間內隨機生成若幹個互不相同的隨機數,比如在從1到20間隨機生成6個互不相同的整數,並通過此文介紹Visual c#中隨機數的用法。

 

.net.Frameword中提供了一個專門產生隨機數的類System.Random,此類默認情況下已被導入,編程過程中可以直接使用。我們知道,計算機並不能產生完全隨機的數字,它生成的數字被稱為偽隨機數,它是以相同的概率從一組有限的數字中選取的,所選的數字並不具有完全的隨機性,但就實用而言,其隨機程度已經足夠了。

 

我們可以用以下兩種方法初始化一個隨機數發生器;

第一種方法不指定隨機種子,係統自動選取當前時前作隨機種子:

Random ra=new Random();

第二種方法是指定一個int型的參數作為隨機種子:

int iSeed=6;

Random ra=new Random(iSeed);

 

下麵我們要用到Random.Next()方法產生隨機數。

ra.Next();

它返回一個大於或等於零而小於2,147,483,647的數,這並不滿足我們的需要,下麵我們介紹它的重載函數和其它一些方法。

 

public virtual int Next(int);

用法:ra.next(20)

返回一個小於所指定最大值(此處為20)的正隨機數。

 

public virtual int Next(int minValue, int maxValue);

用法:ra.next(1,20)

返回一個指定範圍內(此處為1-20之間)的隨機數,我們在下麵的實例中會用到此函數。

 

類System.Random還有幾個方法分別是:

公共方法:

NextBytes用隨機數填充指定字節數組的元素。

NextDouble返回一個介於 0.0 和 1.0 之間的隨機數。

 

受保護的方法:

Sample返回一個介於 0.0 和 1.0 之間的隨機數,隻允許子類對象訪問。

 

以上介紹了隨機數的基本用法,下麵我們用一個實例來做更進一步的介紹。要在一段數字區間內隨機生成若幹個互不相同的隨機數,比如在從1到20間隨機生成6個互不相同的整數。

 

主要是下麵兩個函數getRandomNum與getNum:

 

public int[] getRandomNum(int num,int minValue,int maxValue){

 

Random ra=new Random(unchecked((int)DateTime.Now.Ticks));

int[] arrNum=new int[num];

int tmp=0;

for (int i=0;i<=num-1;i++){

tmp=ra.Next(minValue,maxValue); //隨機取數

arrNum[i]=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值賦到數組中

 

}

return arrNum;

}

 

getRandomNum即是在區間[minValue,maxValue]取出num個互不相同的隨機數,返回的數組包含著結果。

 

其中隨機數是這樣創建的 Random ra=new Random(unchecked((int)DateTime.Now.Ticks));為什麼不用Random ra=new Random();(係統自動選取當前時前作隨機種子)呢?

 

用係統時間做隨機種子並不保險,如果應用程序在一個較快的計算機上運行,則該計算機的係統時鍾可能沒有時間在此構造函數的調用之間進行更改,Random 的不同實例的種子值可能相同。這種情況下,我們就需要另外的算法來保證產生的數字的隨機性。所以為了保證產生的隨機數足夠“隨機”,我們不得不使用複雜一點的方法來獲得隨機種子。 在上麵的這段程序中,我們首先使用係統時間作為隨機種子,然後將上一次產生的隨機數跟循環變量和一個與係統時間有關的整型參數相乘,以之作為隨機種子,從而得到了每次都不同的隨機種子,保證了產生足夠“隨機”的隨機數。 

 

函數getNum是一遞歸,用它來檢測生成的隨機數是否有重複,如果取出來的數字和已取得的數字有重複就重新隨機獲取。值得注意的是要用一同一個隨機數實例生成,所以ra要作為參數傳入getNum中,否則生成的數字會有重複。

 

public int getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra){

int n=0;

while (n<=arrNum.Length-1)



if (arrNum[n]==tmp) //利用循環判斷是否有重複

{

tmp=ra.Next(minValue,maxValue); //重新隨機獲取。

getNum(arrNum,tmp,minValue,maxValue,ra);//遞歸:如果取出來的數字和已取得的數字有重複就重新隨機獲取。

}

n++;

}

return tmp;

}

最後更新:2017-04-02 00:06:38

  上一篇:go jQuery繼承的實現(extends)
  下一篇:go IE,firefox下使用CSS屬性overflow的存在的不同