1. 程式人生 > >random函式的用法

random函式的用法

random是as2.0中的全域性函式,平時一般不用這個,而是使用Math包下的random方法(as2 as3均是)Math,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; } 最後就是要顯示出來,當點選一個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()+"\n"; i++; } label1.Text=temp; //顯示在label1中 } 隨機數的作用不止如此,讀者可用它進行遊戲開發,安全驗證等等,這有待讀者去開發和實踐。 原碼如下: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace random {/// Form1 的摘要說明。 public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.Button button1; private System.Windows.Forms.Label label1;// /// 必需的設計器變數。 private System.ComponentModel.Container components = null; public Form1() { // Windows 窗體設計器支援所必需的 InitializeComponent(); // TODO: 在 InitializeComponent 呼叫後新增任何
建構函式
程式碼 } /// 清理所有正在使用的資源。 protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// 設計器支援所需的方法 - 不要使用程式碼編輯器修改 /// 此方法的內容。 private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.label1 = new System.Windows.Forms.Label(); this.SuspendLayout(); // button1 this.button1.Location = new System.Drawing.Point(96, 32); this.button1.Name = "button1"; this.button1.TabIndex = 0; this.button1.Text = "隨機數"; this.button1.Click += new System.EventHandler(this.button1_Click); // label1 this.label1.BackColor = System.Drawing.SystemColors.Desktop; this.label1.ForeColor = System.Drawing.SystemColors.ActiveCaptionText;