關鍵詞: Visual 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;
}
最後就是要顯示出來,當點選一個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;
this.label1.Location = new System.Drawing.Point(49, 112);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(168, 80);
this.label1.TabIndex = 1;
this.label1.Text = "label1";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.label1,
this.button1});
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
///
/// 應用程式的主入口點。
///
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void button1_Click(object sender, System.EventArgs e)
{
int[] arr=getRandomNum(6,1,20);
int i=0;
string temp="";
while (i<=arr.Length-1){
temp+=arr[i].ToString()+"/n";
i++;
}
label1.Text=temp;
}
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;
}
public int getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra){
//Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
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;
}
}
}
作者: terrysh
http://terrysh.bokee.com/4396429.html