阅读目录
前言
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 < values.Length; i++) 19 { 20 values[i] = rnd.NextDouble(); 21 } 22 } 23 24 ///返回一个(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 < values.Length; i++) 77 { 78 values[i] = rnd.Next(minInclusive, maxExclusive); 79 } 80 } 81 82 ///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



