【原創】開源Math.NET基礎數學類庫使用(12)C#隨機數擴充套件方法
閱讀目錄
前言
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 IEnumerableNextDoubleSequence(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 IEnumerableNextInt32Sequence(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 109 ///; that is, 107 /// the range of return values includes 0 but not .108 /// 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 /// 129 ///and .128 /// 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 /// 145 ///and .144 /// 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#學習筆記-方法引數、擴充套件方法C#筆記套件
- js隨機數生成器的擴充套件JS隨機套件
- C#開源實用的工具類庫,整合超過1000多種擴充套件方法C#套件
- 開源 - Ideal庫 - 常用列舉擴充套件方法(一)Idea套件
- 開源 - Ideal庫 - 特殊時間擴充套件方法(三)Idea套件
- 開源 - Ideal庫 - 常用列舉擴充套件方法(二)Idea套件
- C#學習筆記(補充)——擴充套件方法、事件C#筆記套件事件
- UA MATH563 概率論的數學基礎 中心極限定理6 獨立隨機變數的和與Kolmogorov擴充套件定理H5隨機變數Go套件
- (精華)2020年6月26日 C#類庫 Enum(擴充套件方法)C#套件
- (精華)2020年6月26日 C#類庫 DataTable(擴充套件方法)C#套件
- 開源 - Ideal庫 -獲取特殊時間擴充套件方法(四)Idea套件
- 開源 - Ideal庫 - 常用時間轉換擴充套件方法(一)Idea套件
- 開源 - Ideal庫 - 常用時間轉換擴充套件方法(二)Idea套件
- C#DateTime類擴充套件——獲取旬、季、年天數方法C#套件
- C#中的擴充套件類的理解C#套件
- 開源 - Ideal庫 - 常用時間轉換擴充套件方法(二)QvIdea套件
- 讀構建可擴充套件分散式系統:方法與實踐09可擴充套件資料庫基礎套件分散式資料庫
- 計算機基礎知識擴充套件篇計算機套件
- WPF開源控制元件擴充套件庫 - MaterialDesignExtensions控制元件套件
- C#|.net core 基礎 - 擴充套件陣列新增刪除效能最好的方法C#套件陣列
- C# 反射呼叫擴充類方法C#反射
- 隨機梯度下降法的數學基礎隨機梯度
- ZenML:可擴充套件的開源機器學習MLOps框架套件機器學習框架
- C#列舉(一)使用總結以及擴充套件類分享C#套件
- 擴充套件叢集blk數套件
- 數論分塊擴充套件套件
- 使用cython擴充套件python庫套件Python
- Python標準庫12 數學與隨機數 (math包,random包)Python隨機random
- 再學Blazor——擴充套件方法Blazor套件
- C# 生成隨機數,呼叫Random方法C#隨機random
- 使用Math類生成隨機數隨機
- 分類擴充套件套件
- HttpContext擴充套件類HTTPContext套件
- c# 高階應用 理解擴充套件方法C#套件
- Java 中模擬 C# 的擴充套件方法JavaC#套件
- .NET: 談談C#中的擴充套件方法C#套件
- es6-數值擴充套件套件
- 基於PostgreSQL各種擴充套件派生的開源資料庫名單SQL套件資料庫