天天看點

【原創】開源Math.NET基礎數學類庫使用(13)C#實作其他随機數生成器前言1.Math.NET的其他随機數生成算法2.Math.NET擴充随機數生成算法的實作3.資源

  真正意義上的随機數(或者随機事件)在某次産生過程中是按照實驗過程中表現的分布機率随機産生的,其結果是不可預測的,是不可見的。而計算機中的随機函數是按照一定算法模拟産生的,其結果是确定的,是可見的。我們可以這樣認為這個可預見的結果其出現的機率是100%。是以用計算機随機函數所産生的“随機數”并不随機,是僞随機數。僞随機數的作用在開發中的使用非常常見,是以.NET在System命名空間,提供了一個簡單的Random随機數生成類型。但這個類型并不能滿足所有的需求,本節開始就将陸續介紹Math.NET中有關随機數的擴充以及其他僞随機生成算法編寫的随機數生成器。

  今天要介紹的是Math.NET中擴充的其他随機數生成算法。

<a href="http://zh.wikipedia.org/wiki/%E9%9A%8F%E6%9C%BA%E6%95%B0" target="_blank">http://zh.wikipedia.org/wiki/随機數</a>   随機數是專門的随機試驗的結果。   在統計學的不同技術中需要使用随機數,比如在從統計總體中抽取有代表性的樣本的時候,或者在将實驗動物配置設定到不同的試驗組的過程中,或者在進行蒙特卡羅模拟法計算的時候等等。産生随機數有多種不同的方法。這些方法被稱為随機數生成器。随機數最重要的特性是它在産生時後面的那個數與前面的那個數毫無關系。 真正的随機數是使用實體現象産生的:比如擲錢币、骰子、轉輪、使用電子元件的噪音、核裂變等等。這樣的随機數生成器叫做實體性随機數生成器,它們的缺點是技術要求比較高。在實際應用中往往使用僞随機數就足夠了。這些數列是“似乎”随機的數,實際上它們是通過一個固定的、可以重複的計算方法産生的。它們不真正地随機,因為它們實際上是可以計算出來的,但是它們具有類似于随機數的統計特征。這樣的生成器叫做僞随機數生成器。在真正關鍵性的應用中,比如在密碼學中,人們一般使用真正的随機數。

  Math.NET在MathNet.Numerics.Random命名空間下包括了若幹個其他随機數生成算法,基本介紹如下:

1.Mcg31m1類 與 Mcg59 類,都屬于 矩陣同餘發生器,矩陣同餘發生器是乘同餘線性發生器的一個推廣;2者的參數有些差别; 4.Mrg32k3a,又叫 素數模乘同餘法,素數模乘同餘發生器是提出的一個統計性質較好和周期較大的發生器,目前是使用最廣的一種均勻随機數發生器下面給出兩組經檢驗統計性質是良好的素數模乘同餘發生器; 5.Palf,是一個并行加法滞後的斐波那契僞随機數字生成器。 6.WH1982與WH2006類,是乘線性同餘法,也叫積式發生器,Math.NET實作的2個版本友善是1982和2006,代表作者釋出該算法論文的2個時間,可以參考作者的2篇論文:    1.Wichmann, B. A. &amp;amp; Hill, I. D. (1982), "Algorithm AS 183:An efficient and portable pseudo-random number generator". Applied Statistics 31 (1982) 188-190   2. Wichmann, B. A. &amp;amp; Hill, I. D. (2006), "Generating good pseudo-random numbers".Computational Statistics &amp;amp; Data Analysis 51:3 (2006) 1614-1622

  上面已經已經對Math.NET擴充的幾個随機數生成算法進行了介紹,對于一般人來說,直接用就可以了,但對于特殊的人來說,可能要用到其中一種,可以直接使用C#進行調用即可,當然為了節省大家的時間,這裡對Math.NET的實作做一個簡單的介紹,這樣大家可以更加快速的擴充自己的算法,同時也可以了解實作的原理,對Math.NET有一個更加深入的了解。

   Math.NET對随機數的擴充也是借用了System.Random類,在它的基礎上實作了一個随機數發生器的基類:RandomSource,所有的擴充算法都實作該類,這樣使用RandomSource就非常友善。RandomSource的結構很簡單,對System.Random進行了簡單的封裝,增加了幾個直接生成其他類型随機數的方法,并都可以在繼承中使用。其源碼如下:  

View Code

  在擴充随機數生成算法的時候,直接繼承該類即可,看一下Mcg59的實作源碼:

  随機數的使用大家都很熟練,和Random類差不多,上述擴充的算法中,也包括了很多 靜态方法,可以直接使用。這裡不再舉例說明。

繼續閱讀