c# 隨機(jī)函數(shù)的使用詳解
更新時間:2013年06月09日 10:37:43 作者:
本篇文章是對c#隨機(jī)函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
復(fù)制代碼 代碼如下:
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();
}
隨機(jī)數(shù)的使用很普遍,可用它隨機(jī)顯示圖片,用它防止無聊的人在論壇灌水還可以用來加密信息等等。本文討論如何在一段數(shù)字區(qū)間內(nèi)隨機(jī)生成若干個互不相同的隨機(jī)數(shù),比如在從1到20間隨機(jī)生成6個互不相同的整數(shù),并通過此文介紹Visual c#中隨機(jī)數(shù)的用法。
.net.Frameword中提供了一個專門產(chǎn)生隨機(jī)數(shù)的類System.Random,此類默認(rèn)情況下已被導(dǎo)入,編程過程中可以直接使用。我們知道,計算機(jī)并不能產(chǎn)生完全隨機(jī)的數(shù)字,它生成的數(shù)字被稱為偽隨機(jī)數(shù),它是以相同的概率從一組有限的數(shù)字中選取的,所選的數(shù)字并不具有完全的隨機(jī)性,但就實用而言,其隨機(jī)程度已經(jīng)足夠了。
我們可以用以下兩種方法初始化一個隨機(jī)數(shù)發(fā)生器;
函數(shù)是這樣用,比如100至999的隨機(jī)數(shù)
復(fù)制代碼 代碼如下:
Random ran=new Random();
int RandKey=ran.Next(100,999);
不過這樣會有重復(fù),可以給Random一個系統(tǒng)時間做為參數(shù),以此產(chǎn)生隨機(jī)數(shù),就不會重復(fù)了
第一種方法不指定隨機(jī)種子,系統(tǒng)自動選取當(dāng)前時前作隨機(jī)種子:
復(fù)制代碼 代碼如下:
Random ra=new Random();
第二種方法是指定一個int型的參數(shù)作為隨機(jī)種子:
復(fù)制代碼 代碼如下:
int iSeed=6;
Random ra=new Random(iSeed);
下面我們要用到Random.Next()方法產(chǎn)生隨機(jī)數(shù)。
復(fù)制代碼 代碼如下:
ra.Next();
它返回一個大于或等于零而小于2,147,483,647的數(shù),這并不滿足我們的需要,下面我們介紹它的重載函數(shù)和其它一些方法。
復(fù)制代碼 代碼如下:
publicvirtualint Next(int);用法:ra.next(20)
返回一個小于所指定最大值(此處為20)的正隨機(jī)數(shù)。
復(fù)制代碼 代碼如下:
publicvirtualint Next(int minValue, int maxValue);
用法:ra.next(1,20)
返回一個指定范圍內(nèi)(此處為1-20之間)的隨機(jī)數(shù),我們在下面的實例中會用到此函數(shù)。
類System.Random還有幾個方法分別是:
公共方法:
NextBytes用隨機(jī)數(shù)填充指定字節(jié)數(shù)組的元素。
NextDouble返回一個介于 0.0 和 1.0 之間的隨機(jī)數(shù)。
受保護(hù)的方法:
Sample返回一個介于 0.0 和 1.0 之間的隨機(jī)數(shù),只允許子類對象訪問。
以上介紹了隨機(jī)數(shù)的基本用法,下面我們用一個實例來做更進(jìn)一步的介紹。要在一段數(shù)字區(qū)間內(nèi)隨機(jī)生成若干個互不相同的隨機(jī)數(shù),比如在從1到20間隨機(jī)生成6個互不相同的整數(shù)。
主要是下面兩個函數(shù)getRandomNum與getNum:
復(fù)制代碼 代碼如下:
publicint[] getRandomNum(int num,int minValue,int maxValue)
{
Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
int[] arrNum=newint[num];
int tmp=0;
for (int i=0;i<=num-1;i ){
tmp=ra.Next(minValue,maxValue); //隨機(jī)取數(shù)
arrNum[i]=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值賦到數(shù)組中
}
return arrNum;
}
getRandomNum即是在區(qū)間[minValue,maxValue]取出num個互不相同的隨機(jī)數(shù),返回的數(shù)組包含著結(jié)果。
其中隨機(jī)數(shù)是這樣創(chuàng)建的 Random ra=new Random(unchecked((int)DateTime.Now.Ticks));為什么不用Random ra=new Random();(系統(tǒng)自動選取當(dāng)前時前作隨機(jī)種子)呢?
用系統(tǒng)時間做隨機(jī)種子并不保險,如果應(yīng)用程序在一個較快的計算機(jī)上運(yùn)行,則該計算機(jī)的系統(tǒng)時鐘可能沒有時間在此構(gòu)造函數(shù)的調(diào)用之間進(jìn)行更改,Random 的不同實例的種子值可能相同。這種情況下,我們就需要另外的算法來保證產(chǎn)生的數(shù)字的隨機(jī)性。所以為了保證產(chǎn)生的隨機(jī)數(shù)足夠"隨機(jī)",我們不得不使用復(fù)雜一點的方法來獲得隨機(jī)種子。在上面的這段程序中,我們首先使用系統(tǒng)時間作為隨機(jī)種子,然后將上一次產(chǎn)生的隨機(jī)數(shù)跟循環(huán)變量和一個與系統(tǒng)時間有關(guān)的整型參數(shù)相乘,以之作為隨機(jī)種子,從而得到了每次都不同的隨機(jī)種子,保證了產(chǎn)生足夠"隨機(jī)"的隨機(jī)數(shù)。
函數(shù)getNum是一遞歸,用它來檢測生成的隨機(jī)數(shù)是否有重復(fù),如果取出來的數(shù)字和已取得的數(shù)字有重復(fù)就重新隨機(jī)獲取。值得注意的是要用一同一個隨機(jī)數(shù)實例生成,所以ra要作為參數(shù)傳入getNum中,否則生成的數(shù)字會有重復(fù)。
復(fù)制代碼 代碼如下:
publicint getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra){
int n=0;
while (n<=arrNum.Length-1)
{
if (arrNum[n]==tmp) //利用循環(huán)判斷是否有重復(fù)
{
tmp=ra.Next(minValue,maxValue); //重新隨機(jī)獲取。
getNum(arrNum,tmp,minValue,maxValue,ra);//遞歸:如果取出來的數(shù)字和已取得的數(shù)字有重復(fù)就重新隨機(jī)獲取。
}
}
return tmp;
}
最后就是要顯示出來,當(dāng)點擊一個button時取出的數(shù)字顯示在一個label中。
復(fù)制代碼 代碼如下:
privatevoid button1_Click(object sender, System.EventArgs e)
{
int[] arr=getRandomNum(6,1,20); //從1至20中取出6個互不相同的隨機(jī)數(shù)
int i=0;
string temp="";
while (i<=arr.Length-1){
temp =arr[i].ToString() "";
i ;
}
label1.Text=temp; //顯示在label1中
}
相關(guān)文章
C#基于SQLiteHelper類似SqlHelper類實現(xiàn)存取Sqlite數(shù)據(jù)庫的方法
這篇文章主要介紹了C#基于SQLiteHelper類似SqlHelper類實現(xiàn)存取Sqlite數(shù)據(jù)庫的方法,涉及C#操作SQLite數(shù)據(jù)庫的相關(guān)技巧,需要的朋友可以參考下2015-06-06