302班

          java突擊隊
          posts - 151, comments - 74, trackbacks - 0, articles - 14
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Asp.net中隨機數(shù)的生成

          Posted on 2007-07-08 01:29 停留的風 閱讀(658) 評論(0)  編輯  收藏 所屬分類: .NET技巧特輯
          隨機數(shù)在軟件設(shè)計,尤其是在實踐環(huán)境模擬和測試等領(lǐng)域中得到很廣泛的應(yīng)用。為追求真正的隨機序列,人們曾采用很多種原始的物理方法用于生成一定范圍內(nèi)滿足精度(位數(shù))的均勻分布序列,其缺點在于:速度慢、效率低、需占用大量存儲空間且不可重現(xiàn)等。為滿足計算機模擬研究的需求,人們轉(zhuǎn)而研究用算法生成模擬各種概率分布的偽隨機序列。偽隨機數(shù)是指用數(shù)學遞推公式所產(chǎn)生的隨機數(shù)。從實用的角度看,獲取這種數(shù)的最簡單和最自然的方法是利用計算機語言的函數(shù)庫提供的隨機數(shù)發(fā)生器。不同的開發(fā)環(huán)境提供的生成隨機數(shù)的函數(shù)和方法不一樣。典型情況下,它會輸出一個均勻分布在0和1區(qū)間內(nèi)的偽隨機變量的值。

              隨機數(shù)發(fā)生器

            在計算機中產(chǎn)生隨機數(shù)的方法,經(jīng)常采用下面的公式:





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

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

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

          #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中偽隨機數(shù)生成機制

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

            1、VB.NET內(nèi)建函數(shù)

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

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

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

            2、隨機數(shù)類System.Random

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

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

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

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

            3、測試程序編寫

            在運行ASP.NET程序前必須建立其開發(fā)運行環(huán)境,包括配置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>


            其測試結(jié)果如圖1所示:



                         圖1   偽隨機數(shù)測試運行結(jié)果

          主站蜘蛛池模板: 玉山县| 三河市| 西贡区| 宿州市| 津南区| 旬邑县| 三明市| 万州区| 监利县| 明星| 仁布县| 洛宁县| 金秀| 延川县| 张家川| 荥经县| 阿荣旗| 华池县| 松溪县| 贵德县| 绍兴市| 六盘水市| 宿迁市| 息烽县| 云林县| 吉安市| 越西县| 康平县| 霞浦县| 巫山县| 武乡县| 抚松县| 庄河市| 大同县| 阜平县| 晋城| 泾阳县| 佛冈县| 景德镇市| 中阳县| 丹棱县|