【原創】開源Math.NET基礎數學類庫使用(12)C#隨機數擴充套件方法

daqianmen發表於2021-09-09

閱讀目錄

  • 前言

  • 1.Random的擴充套件方法類

  • 2.RandomExtensions類的實現

  • 3.資源

               本部落格所有文章分類的總目錄:【總目錄】本部落格博文總目錄-實時更新 

開源Math.NET基礎數學類庫使用總目錄:【目錄】開源Math.NET基礎數學類庫使用總目錄

回到目錄

前言

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

  今天要介紹的是基於System.Random的擴充套件方法。

  如果本文顯示有問題,請參考:http://www.cnblogs.com/asxinyu/p/4301544.html

回到目錄

1.Random的擴充套件方法類

  Rondom擴充套件及隨機數相關的類都在Math.NET的MathNet.Numerics.Random名稱空間,今天要介紹的 RandomExtensions 類是 擴充套件Random的靜態方法類,可以直接在System.Random的物件上使用,相關功能介紹:

1.可以直接返回填充0-1隨機資料的陣列,如NextDoubles方法

2.可以返回一個無限長度的IEnumerable介面物件,一直迭代返回double型別的隨機數,是NextDoubleSequence方法

3.類似的還可以返回其他型別的隨機資料陣列,如NextBytes,NextInt32s等

4.還可以單獨返回Int32型別和Int64型別的隨機數,其範圍在該型別的所有值域上,如NextFullRangeInt32,NextFullRangeInt64

5.還可以單獨返回Int32型別和Int64型別的隨機數,其範圍是該型別所有值域上的非負數,如NextInt64;

回到目錄

2.RandomExtensions類的實現

  作為靜態類,使用非常簡單,為了方便理解,我將註釋進行了部分翻譯,貼出該類的所有原始碼,大家可以參考參考: 

圖片描述

  1 /// 這個類是對System.Random類的擴充套件,擴充套件方法可以生成更多型別的偽隨機數,而不是僅僅是double和Int32型別  2 /// 這個擴充套件是執行緒安全的,並且只有在Math.NET提供的隨機數發生器或者RandomSource的繼承類中被呼叫  3 public static class RandomExtensions  4 {  5     /// 使用(0-1)範圍內的均勻隨機數填充1個陣列  6     /// Random型別的隨機數生成器  7     /// 要填充隨機數的陣列  8     /// 這個擴充套件是執行緒安全的,並且只有在Math.NET提供的隨機數發生器或者RandomSource的繼承類中被呼叫  9     public static void NextDoubles(this System.Random rnd, double[] values) 10     { 11         var rs = rnd as RandomSource; 12         if (rs != null) 13         { 14             rs.NextDoubles(values); 15             return; 16         } 17  18         for (var i = 0; i 返回一個(0-1)範圍內的均勻隨機數填充1個陣列 25     /// Random型別的隨機數生成器 26     /// 要返回的陣列的長度 27     28     public static double[] NextDoubles(this System.Random rnd, int count) 29     { 30         var values = new double[count]; 31         NextDoubles(rnd, values); 32         return values; 33     } 34  35     /// 返回1個無限的0-1均勻分佈隨機數序列 36     public static IEnumerable NextDoubleSequence(this System.Random rnd) 37     { 38         var rs = rnd as RandomSource; 39         if (rs != null) return rs.NextDoubleSequence(); 40         return NextDoubleSequenceEnumerable(rnd); 41     } 42  43     static IEnumerable NextDoubleSequenceEnumerable(System.Random rnd) 44     { 45         while (true) 46         { 47             yield return rnd.NextDouble(); 48         } 49     } 50  51     /// 返回1個均勻分佈的byte陣列 52     /// Random型別的隨機數生成器 53     /// 要返回的陣列的長度 54     public static byte[] NextBytes(this System.Random rnd, int count) 55     { 56         var values = new byte[count]; 57         rnd.NextBytes(values); 58         return values; 59     } 60  61     ///  62     /// Fills an array with uniform random numbers greater than or equal to 0.0 and less than 1.0. 63     ///  64     /// The random number generator. 65     /// The array to fill with random values. 66     /// Lower bound, inclusive. 67     /// Upper bound, exclusive. 68     public static void NextInt32s(this System.Random rnd, int[] values, int minInclusive, int maxExclusive) 69     { 70         var rs = rnd as RandomSource; 71         if (rs != null) 72         { 73             rs.NextInt32s(values, minInclusive, maxExclusive); 74             return; 75         } 76         for (var i = 0; i  83     /// Returns an infinite sequence of uniform random numbers greater than or equal to 0.0 and less than 1.0. 84     ///  85     public static IEnumerable NextInt32Sequence(this System.Random rnd, int minInclusive, int maxExclusive) 86     { 87         var rs = rnd as RandomSource; 88         if (rs != null) 89         { 90             return rs.NextInt32Sequence(minInclusive, maxExclusive); 91         } 92         return NextInt32SequenceEnumerable(rnd, minInclusive, maxExclusive); 93     } 94  95     static IEnumerable NextInt32SequenceEnumerable(System.Random rnd, int minInclusive, int maxExclusive) 96     { 97         while (true) 98         { 99             yield return rnd.Next(minInclusive, maxExclusive);100         }101     }102 103     /// 返回Int64型別的非負隨機數104     /// Random型別的隨機數生成器105     /// 106     /// A 64-bit signed integer greater than or equal to 0, and less than ; that is, 107     /// the range of return values includes 0 but not .108     /// 109     /// 110     public static long NextInt64(this System.Random rnd)111     {112         var buffer = new byte[sizeof (long)];113 114         rnd.NextBytes(buffer);115         var candidate = BitConverter.ToInt64(buffer, 0);116 117         candidate &= long.MaxValue;118         return (candidate == long.MaxValue) ? rnd.NextInt64() : candidate;119     }120 121     /// 122     /// Returns a random number of the full Int32 range.123     /// 124     /// The random number generator.125     /// 126     /// A 32-bit signed integer of the full range, including 0, negative numbers,127     ///  and .128     /// 129     /// 130     public static int NextFullRangeInt32(this System.Random rnd)131     {132         var buffer = new byte[sizeof (int)];133         rnd.NextBytes(buffer);134         return BitConverter.ToInt32(buffer, 0);135     }136 137     /// 138     /// Returns a random number of the full Int64 range.139     /// 140     /// The random number generator.141     /// 142     /// A 64-bit signed integer of the full range, including 0, negative numbers,143     ///  and .144     /// 145     /// 146     public static long NextFullRangeInt64(this System.Random rnd)147     {148         var buffer = new byte[sizeof (long)];149         rnd.NextBytes(buffer);150         return BitConverter.ToInt64(buffer, 0);151     }152 153     /// 154     /// Returns a nonnegative decimal floating point random number less than 1.0.155     /// 156     /// The random number generator.157     /// 158     /// A decimal floating point number greater than or equal to 0.0, and less than 1.0; that is, 159     /// the range of return values includes 0.0 but not 1.0.160     /// 161     public static decimal NextDecimal(this System.Random rnd)162     {163         decimal candidate;164 165         // 50.049 % chance that the number is below 1.0. Try until we have one.166         // Guarantees that any decimal in the interval can167         // indeed be reached, with uniform probability.168         do169         {170             candidate = new decimal(171                 rnd.NextFullRangeInt32(),172                 rnd.NextFullRangeInt32(),173                 rnd.NextFullRangeInt32(),174                 false,175                 28);176         }177         while (candidate >= 1.0m);178 179         return candidate;180     }181 }

圖片描述

  其使用非常簡單,這裡就不再舉例子。這種擴充套件大家也應該寫過,後面幾篇文章將介紹Math.NET中實現的其他演算法的隨機數發生器。請關注

回到目錄

3.資源

  原始碼下載:http://www.cnblogs.com/asxinyu/p/4264638.html

  如果本文顯示有問題,請參考本文原文:http://www.cnblogs.com/asxinyu/p/4301544.html



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1727/viewspace-2806720/,如需轉載,請註明出處,否則將追究法律責任。

相關文章