原文:【原创】开源Math.NET基础数学类库使用(12)C#随机数扩展方法

               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html

开源Math.NET基础数学类库使用总目录:http://www.cnblogs.com/asxinyu/p/4329737.html

前言

  真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的。而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的。我们可以这样认为这个可预见的结果其出现的概率是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. /// <summary>这个类是对System.Random类的扩展,扩展方法可以生成更多类型的伪随机数,而不是仅仅是double和Int32类型</summary>
  2. /// <remarks>这个扩展是线程安全的,并且只有在Math.NET提供的随机数发生器或者RandomSource的继承类中被调用</remarks>
  3. public static class RandomExtensions
  4. {
  5. /// <summary>使用(0-1)范围内的均匀随机数填充1个数组</summary>
  6. /// <param name="rnd">Random类型的随机数生成器</param>
  7. /// <param name="values">要填充随机数的数组</param>
  8. /// <remarks>这个扩展是线程安全的,并且只有在Math.NET提供的随机数发生器或者RandomSource的继承类中被调用</remarks>
  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 = ; i < values.Length; i++)
  19. {
  20. values[i] = rnd.NextDouble();
  21. }
  22. }
  23.  
  24. /// <summary>返回一个(0-1)范围内的均匀随机数填充1个数组</summary>
  25. /// <param name="rnd">Random类型的随机数生成器</param>
  26. /// <param name="count">要返回的数组的长度</param>
  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. /// <summary>返回1个无限的0-1均匀分布随机数序列</summary>
  36. public static IEnumerable<double> 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<double> NextDoubleSequenceEnumerable(System.Random rnd)
  44. {
  45. while (true)
  46. {
  47. yield return rnd.NextDouble();
  48. }
  49. }
  50.  
  51. /// <summary>返回1个均匀分布的byte数组</summary>
  52. /// <param name="rnd">Random类型的随机数生成器</param>
  53. /// <param name="count">要返回的数组的长度</param>
  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. /// <summary>
  62. /// Fills an array with uniform random numbers greater than or equal to 0.0 and less than 1.0.
  63. /// </summary>
  64. /// <param name="rnd">The random number generator.</param>
  65. /// <param name="values">The array to fill with random values.</param>
  66. /// <param name="minInclusive">Lower bound, inclusive.</param>
  67. /// <param name="maxExclusive">Upper bound, exclusive.</param>
  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 = ; i < values.Length; i++)
  77. {
  78. values[i] = rnd.Next(minInclusive, maxExclusive);
  79. }
  80. }
  81.  
  82. /// <summary>
  83. /// Returns an infinite sequence of uniform random numbers greater than or equal to 0.0 and less than 1.0.
  84. /// </summary>
  85. public static IEnumerable<int> 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<int> NextInt32SequenceEnumerable(System.Random rnd, int minInclusive, int maxExclusive)
  96. {
  97. while (true)
  98. {
  99. yield return rnd.Next(minInclusive, maxExclusive);
  100. }
  101. }
  102.  
  103. /// <summary>返回Int64类型的非负随机数</summary>
  104. /// <param name="rnd">Random类型的随机数生成器</param>
  105. /// <returns>
  106. /// A 64-bit signed integer greater than or equal to 0, and less than <see cref="Int64.MaxValue"/>; that is,
  107. /// the range of return values includes 0 but not <see cref="Int64.MaxValue"/>.
  108. /// </returns>
  109. /// <seealso cref="NextFullRangeInt64"/>
  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, );
  116.  
  117. candidate &= long.MaxValue;
  118. return (candidate == long.MaxValue) ? rnd.NextInt64() : candidate;
  119. }
  120.  
  121. /// <summary>
  122. /// Returns a random number of the full Int32 range.
  123. /// </summary>
  124. /// <param name="rnd">The random number generator.</param>
  125. /// <returns>
  126. /// A 32-bit signed integer of the full range, including 0, negative numbers,
  127. /// <see cref="Int32.MaxValue"/> and <see cref="Int32.MinValue"/>.
  128. /// </returns>
  129. /// <seealso cref="System.Random.Next()"/>
  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, );
  135. }
  136.  
  137. /// <summary>
  138. /// Returns a random number of the full Int64 range.
  139. /// </summary>
  140. /// <param name="rnd">The random number generator.</param>
  141. /// <returns>
  142. /// A 64-bit signed integer of the full range, including 0, negative numbers,
  143. /// <see cref="Int64.MaxValue"/> and <see cref="Int64.MinValue"/>.
  144. /// </returns>
  145. /// <seealso cref="NextInt64"/>
  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, );
  151. }
  152.  
  153. /// <summary>
  154. /// Returns a nonnegative decimal floating point random number less than 1.0.
  155. /// </summary>
  156. /// <param name="rnd">The random number generator.</param>
  157. /// <returns>
  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. /// </returns>
  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 can
  167. // indeed be reached, with uniform probability.
  168. do
  169. {
  170. candidate = new decimal(
  171. rnd.NextFullRangeInt32(),
  172. rnd.NextFullRangeInt32(),
  173. rnd.NextFullRangeInt32(),
  174. false,
  175. );
  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

开源Math.NET基础数学类库使用(12)C#随机数扩展方法的更多相关文章

  1. 【原创】开源Math.NET基础数学类库使用(12)C#随机数扩展方法

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  2. 【目录】开源Math.NET基础数学类库使用总目录

    本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新  1.开源Math.NET数学组件文章   1.开源Math.NET基础数学类库使用(01)综合介绍   2.开源Math.NET ...

  3. 【原创】开源Math.NET基础数学类库使用(02)矩阵向量计算

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  4. 【原创】开源Math.NET基础数学类库使用(07)常用的数学物理常数

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 1.前 ...

  5. 【原创】开源Math.NET基础数学类库使用(09)相关数论函数使用

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  6. 开源Math.NET基础数学类库使用(11)C#计算相关系数

    阅读目录 前言 1.Math.NET计算相关系数的类 2.Correlation的实现 3.使用案例 4.资源                本博客所有文章分类的总目录:[总目录]本博客博文总目录-实 ...

  7. 开源Math.NET基础数学类库使用(09)相关数论函数使用

    原文:[原创]开源Math.NET基础数学类库使用(09)相关数论函数使用               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4 ...

  8. 开源Math.NET基础数学类库使用(07)一些常用的数学物理常数

    原文:[原创]开源Math.NET基础数学类库使用(07)一些常用的数学物理常数               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/ ...

  9. 开源Math.NET基础数学类库使用(06)数值分析之线性方程组直接求解

    原文:[原创]开源Math.NET基础数学类库使用(06)数值分析之线性方程组直接求解 开源Math.NET基础数学类库使用系列文章总目录:   1.开源.NET基础数学计算组件Math.NET(一) ...

随机推荐

  1. Error : APP-FND-01926: The custom event WHEN-LOGON-CHANGED raised unhandled exception: ORA-06502: PL

    In this Document   _afrLoop=440418974213449&id=1508865.1&_afrWindowMode=0&_adf.ctrl-stat ...

  2. VB.NET版机房收费系统---导出Excel表格

    datagridview,翻译成中文的意思是数据表格显示,使用DataGridView控件,能够显示和编辑来自不同类型的数据源的表格,将数据绑定到DataGridView控件很easy和直观,大多数情 ...

  3. Python 收集Twitter时间序列数据

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-18 @author: guaguastd @name: c ...

  4. java性能缓慢

    虚拟帝国上面有很多营销软件是JAVA开发的!创业公司通常选择开源技术减少项目管理费用. 除了使用Java编程语言,创业公司也可以利用Java开发工具包的好处(JDK),Java运行时环境(JRE)和J ...

  5. Justinmind教程(3)——管理原型

    如已经描述Justinmind概述和Justinmind简单的计算器功能 Justinmind使用教程(1)--概述部分 Justinmind使用教程(2)--计算表达式及条件用法 本章将回到最原始的 ...

  6. hibernate 一对多,多对一,多对多实体映射完美解决方案(再也不会糊涂了,哈哈)

  7. Exec l 中分列的作用

  8. 转载:PHP时间戳 strtotime()使用方法和技巧

    在php中我想要获取时间戳有多种方法,最常用的就是使用time函数与strtotime()函数把日期转换成时间戳了 获取指定的年月日转化为时间戳:pHP时间戳函数获取指定日期的unix时间戳 strt ...

  9. 使用dom4j创建和解析xml

    之前工作中用到了,相信写java的都会碰到xml,这里写了两个方法,创建和解析xml,废话不多说,直接上代码 package xml; import java.io.File; import java ...

  10. HDOJ 4687 Boke and Tsukkomi 一般图最大匹配带花树+暴力

    一般图最大匹配带花树+暴力: 先算最大匹配 C1 在枚举每一条边,去掉和这条边两个端点有关的边.....再跑Edmonds得到匹配C2 假设C2+2==C1则这条边再某个最大匹配中 Boke and ...