top
Loading...
ASP.NET中隨機數生成及應用
摘  要  偽隨機數在計算機軟件設計中有很廣泛的用途。本文介紹了偽隨機數生成的一般原理,以及利用ASP.NET Framework中提供的Random類及其方法來生成各種不同范圍的滿足各種要求的隨機數。最后結合Web控件表單闡述了ASP.NET中的隨機數在軟件設計中的應用。

關鍵詞  ASP.NET;偽隨機數生成;Web; Random類

  隨機數在軟件設計,尤其是在實踐環境模擬和測試等領域中得到很廣泛的應用。為追求真正的隨機序列,人們曾采用很多種原始的物理方法用于生成一定范圍內滿足精度(位數)的均勻分布序列,其缺點在于:速度慢、效率低、需占用大量存儲空間且不可重現等。為滿足計算機模擬研究的需求,人們轉而研究用算法生成模擬各種概率分布的偽隨機序列。偽隨機數是指用數學遞推公式所產生的隨機數。從實用的角度看,獲取這種數的最簡單和最自然的方法是利用計算機語言的函數庫提供的隨機數發生器。不同的開發環境提供的生成隨機數的函數和方法不一樣。典型情況下,它會輸出一個均勻分布在0和1區間內的偽隨機變量的值。

  隨機數發生器

在計算機中產生隨機數的方法,經常采用下面的公式:





用這個公式產生0'65536的隨機數a1,a2,…序列的程序,稱為232步長的倍增諧和隨機數發生器。其中b、c、d為正整數,d稱為由公式所產生的隨機序列的種子。

    由該公式可以看出,一旦參數b、c、d確定之后,所產生的隨機序列也是確定的。這種只在一定程度上滿足隨機性的序列稱為偽隨機數。

下面是隨機數發生器的一個例子。其中,函數random_seed提供給用戶選擇隨機數的種子,當形式參數d=0時,取系統當前時間作為隨機數種子;當d≠0時,就選用d作為種子;函數random在給定種子的基礎上,計算新的種子,并產生一個范圍為low'high的新的隨機數。

#define  MULTIPLIER   0x015A4E35L
#define  INCREMENT   1

void  random_seed( unsigned long  d){
if ( d == 0 )seed = time(0);
else  seed = d;}
unsigned  int random(unsigned long low,unsigned long high)
{
    seed = MULTIPLIER * seed + INCREMENT;
    return ((seed >>16 )% ( high-low ) + low );
}
}

 ASP.NET中偽隨機數生成機制

計算機不可能產生完全隨機的數字。所謂的隨機數發生器都是通過一定的算法對事先選定的隨機種子做復雜的運算,用產生的結果來近似的模擬完全隨機數,這種隨機數被稱作偽隨機數。偽隨機數是以相同的概率從一組有限的數字中選取的。所選數字并不具有完全的隨機性,但是從實用的角度而言,其隨機程度已足夠了。

1、VB.NET內建函數

     ASP.NET程序可以采用多種編程語言,其默認的程序語言是VB.NET,雖然VB.NET和VB有些相似,但它們的應用環境不一樣,編寫代碼的方法也有所不同。在VB.NET中,如果要使用數學函數,必須通過.NET Framework提供的Math類,它位于System命名空間下,用戶可以在代碼頂部添加Imports System. Math以便使用這些數學函數。

其中用于產生隨機數的函數原型為:Rnd(x),該函數用以產生一個介于0'1之間的單精度隨機數。x是產生隨機數的種子。如果要從(min, max)這個范圍內隨機抽取一個數,此時需要用到公式:隨機數 = (max - min) * Rnd(x) + min。

偽隨機數的選擇是從隨機種子開始的,為了保證每次得到的偽隨機數都足夠地“隨機”,隨機種子的選擇就顯得非常重要。如果選擇的隨機種子一樣則生成的隨機序列也相同。一般地,使用同系統時間有關的參數作為隨機種子,這也是.net Framework中的隨機數發生器默認采用的方法。

2、隨機數類System.Random

隨機數類System.Random類提供以下方法用于產生各種滿足不同要求的隨機數,如表1所示:

表1    System.Random類提供的各種方法

編號
方法名稱
功能描述
1
Next()
返回一個0'2147483647之間的整數
2
Next(i)
返回一個0'i之間的整數
3
Next(i,j)
返回一個i'j之間的整數
4
  Nextdouble()
返回一個0'1之間的隨機小數
5
 Nextdouble(  byte())
用0'255之間的隨機整數作為字節數組各元素的值。

使用隨機數類System.Random必須先聲明。如果要使用Nextbytes(byte())方法,在使用前也必須聲明字節數組。

3、測試程序編寫

在運行ASP.NET程序前必須建立其開發運行環境,包括配置Microsoft IIS和安裝.NET Framework SDK以及機MSE編輯器。MSE編輯器是Microsoft Office的一個附加軟件,作為ASP.NET的編輯工具非常方便。測試程序代碼如下:

<script language="vb" runat="server">

sub page_load(send as object,e as eventargs)
dim r1 as random =new random()
response.write("The result of r1.next()is:"+r1.next().tostring())
response.write("Theresultofr1.next(100)is:" +r1.next(100).tostring())
response.write("The result of r1.next(100,150) is:"+r1.next(100,150).tostring())
response.write("The result of r1.nextdouble() is:"+r1.nextdouble().tostring())
r1.nextbytes(r)  // dim r(300) as byte
response.write("the r(100) is:")
response.write(r(199))
 end sub </script>

其測試結果如圖1所示:



               圖1   偽隨機數測試運行結果

實例開發

應用程序需求分析:創建一個用于模擬擲骰子游戲的應用程序。此游戲中,游戲者將隨機滾動一個骰子。每一個骰子有六個面,分別代表1,2,3,4,5,6這六個點。當骰子停下以后,觀察骰子上表面的點數。如果擲得的點數為6,則提示贏的信息,否則將繼續投擲。

1、關鍵技術

1.1  Web控件表單

 Web控件表單具有高級語言的面向對象的特性,它是ASP.NET中System.Web.UI.WebControls命名空間的對象。其處理過程與HTML控件表單相似,有如下幾個特點:表單在服務器端運行;輸入域都是控件,具有強大且豐富的屬性和方法,輸入域的信息可以保留;具備對輸入域的驗證能力;包含有數據顯示控件等。

一個典型的Web控件表單代碼如下:

<asp: button id=”sub3”  text=”confirm” runat=”server”/>

其中ASP:XXX指明是哪一類Web控件;ID屬性指明控件的標識名稱;Runat屬性的值為server,指明這是在服務器端運行的控件。

    本例中將用到的Web控件主要為按鈕控件。其中Image控件用于顯示圖像文件,有以下幾個屬性:Imageurl,指明圖像文件的URL;Width,圖像文件顯示的寬度;Height,圖像文件顯示的高度等。

1.2  偽隨機數生成

     根據需求分析描述,為模擬隨機投擲骰子所得到的點數,需要隨機產生范圍在1'6之間的整數,此時可利用到System.Random類的Next(i,j)方法,這里i=1,j=7。(筆者編寫了一個測試程序發現如果j=6,所生成的隨機數在1'5之間)

2、程序實現

該程序的主要代碼實現如下:

<script language="vb"  runat="server">

sub disp(obj as object,e as eventargs)

dim r1 as random =new random()   //定義一個隨機數類

dim file_prefix as string = "Imagesdie"

dim file_suffix as string = ".png"

value = r1.next(1,7)  //dim value as Integer

s1 = file_prefix + value.tostring() + file_suffix

pic1.imageurl = s1  //更新Image控件的imageurl屬性

if value = 6 then

     disp.text = "You win"  //顯示提示信息

else

     disp.text = "Try again"

end if

end sub

</script>

<form id="form1" runat="server"><br>

<asp:button id="disp" runat="server" onclick="disp" text="start"/>

<asp:image id="pic1" runat="server" width="50" height="50"/></form>

程序的運行結果如圖2所示:



           圖2   程序運行結果

  結束語

    Web應用程序中有很多地方都要用到偽隨機數,如何選擇生成隨機序列的種子參數,以及選用何種隨機算法以期生成性能更佳的偽隨機序列是計算機軟件開發人員追求的目標之一。利用ASP.NET框架提供了偽隨機數生成類以及腳本語言VB.NET提供的函數方法可以生成各種滿足不同要求的隨機序列。如在Web系統中用于身份認證的隨機校驗碼就用到了隨機數生成的技術,這點在網站上有很多文章介紹,在此不再贅述。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗