private static char[] constant = { '0','1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' }; public static string GenerateRandomNumber(int Length) { System.Text.StringBuilder newRandom = new System.Text.StringBuilder(62); Random rd = new Random(); for (int i = 0; i < Length; i++) { newRandom.Append(constant[rd.Next(62)]); } return newRandom.ToString(); }
隨機數的使用很普遍,可用它隨機顯示圖片,用它防止無聊的人在論壇灌水還可以用來加密信息等等。本文討論如何在一段數字區間內隨機生成若干個互不相同的隨機數,比如在從1到20間隨機生成6個互不相同的整數,並通過此文介紹Visual c#中隨機數的用法。
.net.Frameword中提供了一個專門產生隨機數的類System.Random,此類默認情況下已被導入,編程過程中可以直接使用。我們知道, 計算機並不能產生完全隨機的數字,它生成的數字被稱為偽隨機數,它是以相同的概率從一組有限的數字中選取的,所選的數字並不具有完全的隨機性,但就實用而 言,其隨機程度已經足夠了。
我們可以用以下兩種方法初始化一個隨機數發生器;
函數是這樣用,比如100至999的隨機數
int RandKey = ran.Next( 100 , 999 );
不過這樣會有重復,可以給Random一個系統時間做為參數,以此產生隨機數,就不會重復了
第一種方法不指定隨機種子,系統自動選取當前時前作隨機種子:
第二種方法是指定一個int型的參數作為隨機種子:
Random ra = new Random(iSeed);
下面我們要用到Random.Next()方法產生隨機數。
它返回一個大於或等於零而小於2,147,483,647的數,這並不滿足我們的需要,下面我們介紹它的重載函數和其它一些方法。
用法:ra.next(20)
返回一個小於所指定最大值(此處為20)的正隨機數。
用法: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; }
最后就是要顯示出來,當點擊一個button時取出的數字顯示在一個label中。
private void button1_Click(object sender, System.EventArgs e) { int[] arr=getRandomNum(6,1,20); //從1至20中取出6個互不相同的隨機數 int i=0; string temp=""; while (i<=arr.Length-1){ temp =arr[i].ToString() " "; i ; } label1.Text=temp; //顯示在label1中 }
{
' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' , ' 9 ' ,
' a ' , ' b ' , ' c ' , ' d ' , ' e ' , ' f ' , ' g ' , ' h ' , ' i ' , ' j ' , ' k ' , ' l ' , ' m ' , ' n ' , ' o ' , ' p ' , ' q ' , ' r ' , ' s ' , ' t ' , ' u ' , ' v ' , ' w ' , ' x ' , ' y ' , ' z ' ,
' A ' , ' B ' , ' C ' , ' D ' , ' E ' , ' F ' , ' G ' , ' H ' , ' I ' , ' J ' , ' K ' , ' L ' , ' M ' , ' N ' , ' O ' , ' P ' , ' Q ' , ' R ' , ' S ' , ' T ' , ' U ' , ' V ' , ' W ' , ' X ' , ' Y ' , ' Z '
};
public static string GenerateRandomNumber( int Length)
{
System.Text.StringBuilder newRandom = new System.Text.StringBuilder( 62 );
Random rd = new Random();
for ( int i = 0 ; i < Length; i ++ )
{
newRandom.Append(constant[rd.Next( 62 )]);
}
return newRandom.ToString();
}