【原创】开源Math.NET基础数学类库使用(12)C#随机数扩展方法
2015-03-17 08:21
1061 查看
本博客所有文章分类的总目录:【总目录】本博客博文总目录-实时更新
开源Math.NET基础数学类库使用总目录:【目录】开源Math.NET基础数学类库使用总目录
今天要介绍的是基于System.Random的扩展方法。
如果本文显示有问题,请参考:http://www.cnblogs.com/asxinyu/p/4301544.html
1.可以直接返回填充0-1随机数据的数组,如NextDoubles方法;
2.可以返回一个无限长度的IEnumerable接口对象,一直迭代返回double类型的随机数,是NextDoubleSequence方法;
3.类似的还可以返回其他类型的随机数据数组,如NextBytes,NextInt32s等;
4.还可以单独返回Int32类型和Int64类型的随机数,其范围在该类型的所有值域上,如NextFullRangeInt32,NextFullRangeInt64;
5.[b]还可以单独返回Int32类型和Int64类型的随机数,其范围是该类型所有值域上的非负数,如NextInt64;[/b]
其使用非常简单,这里就不再举例子。这种扩展大家也应该写过,后面几篇文章将介绍Math.NET中实现的其他算法的随机数发生器。请关注
如果本文显示有问题,请参考本文原文:http://www.cnblogs.com/asxinyu/p/4301544.html
开源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.[b]还可以单独返回Int32类型和Int64类型的随机数,其范围是该类型所有值域上的非负数,如NextInt64;[/b]
2.RandomExtensions类的实现
作为静态类,使用非常简单,为了方便理解,我将注释进行了部分翻译,贴出该类的所有源码,大家可以参考参考:/// <summary>这个类是对System.Random类的扩展,扩展方法可以生成更多类型的伪随机数,而不是仅仅是double和Int32类型</summary> /// <remarks>这个扩展是线程安全的,并且只有在Math.NET提供的随机数发生器或者RandomSource的继承类中被调用</remarks> public static class RandomExtensions { /// <summary>使用(0-1)范围内的均匀随机数填充1个数组</summary> /// <param name="rnd">Random类型的随机数生成器</param> /// <param name="values">要填充随机数的数组</param> /// <remarks>这个扩展是线程安全的,并且只有在Math.NET提供的随机数发生器或者RandomSource的继承类中被调用</remarks> public static void NextDoubles(this System.Random rnd, double[] values) { var rs = rnd as RandomSource; if (rs != null) { rs.NextDoubles(values); return; } for (var i = 0; i < values.Length; i++) { values[i] = rnd.NextDouble(); } } /// <summary>返回一个(0-1)范围内的均匀随机数填充1个数组</summary> /// <param name="rnd">Random类型的随机数生成器</param> /// <param name="count">要返回的数组的长度</param> public static double[] NextDoubles(this System.Random rnd, int count) { var values = new double[count]; NextDoubles(rnd, values); return values; } /// <summary>返回1个无限的0-1均匀分布随机数序列</summary> public static IEnumerable<double> NextDoubleSequence(this System.Random rnd) { var rs = rnd as RandomSource; if (rs != null) return rs.NextDoubleSequence(); return NextDoubleSequenceEnumerable(rnd); } static IEnumerable<double> NextDoubleSequenceEnumerable(System.Random rnd) { while (true) { yield return rnd.NextDouble(); } } /// <summary>返回1个均匀分布的byte数组</summary> /// <param name="rnd">Random类型的随机数生成器</param> /// <param name="count">要返回的数组的长度</param> public static byte[] NextBytes(this System.Random rnd, int count) { var values = new byte[count]; rnd.NextBytes(values); return values; } /// <summary> /// Fills an array with uniform random numbers greater than or equal to 0.0 and less than 1.0. /// </summary> /// <param name="rnd">The random number generator.</param> /// <param name="values">The array to fill with random values.</param> /// <param name="minInclusive">Lower bound, inclusive.</param> /// <param name="maxExclusive">Upper bound, exclusive.</param> public static void NextInt32s(this System.Random rnd, int[] values, int minInclusive, int maxExclusive) { var rs = rnd as RandomSource; if (rs != null) { rs.NextInt32s(values, minInclusive, maxExclusive); return; } for (var i = 0; i < values.Length; i++) { values[i] = rnd.Next(minInclusive, maxExclusive); } } /// <summary> /// Returns an infinite sequence of uniform random numbers greater than or equal to 0.0 and less than 1.0. /// </summary> public static IEnumerable<int> NextInt32Sequence(this System.Random rnd, int minInclusive, int maxExclusive) { var rs = rnd as RandomSource; if (rs != null) { return rs.NextInt32Sequence(minInclusive, maxExclusive); } return NextInt32SequenceEnumerable(rnd, minInclusive, maxExclusive); } static IEnumerable<int> NextInt32SequenceEnumerable(System.Random rnd, int minInclusive, int maxExclusive) { while (true) { yield return rnd.Next(minInclusive, maxExclusive); } } /// <summary>返回Int64类型的非负随机数</summary> /// <param name="rnd">Random类型的随机数生成器</param> /// <returns> /// A 64-bit signed integer greater than or equal to 0, and less than <see cref="Int64.MaxValue"/>; that is, /// the range of return values includes 0 but not <see cref="Int64.MaxValue"/>. /// </returns> /// <seealso cref="NextFullRangeInt64"/> public static long NextInt64(this System.Random rnd) { var buffer = new byte[sizeof (long)]; rnd.NextBytes(buffer); var candidate = BitConverter.ToInt64(buffer, 0); candidate &= long.MaxValue; return (candidate == long.MaxValue) ? rnd.NextInt64() : candidate; } /// <summary> /// Returns a random number of the full Int32 range. /// </summary> /// <param name="rnd">The random number generator.</param> /// <returns> /// A 32-bit signed integer of the full range, including 0, negative numbers, /// <see cref="Int32.MaxValue"/> and <see cref="Int32.MinValue"/>. /// </returns> /// <seealso cref="System.Random.Next()"/> public static int NextFullRangeInt32(this System.Random rnd) { var buffer = new byte[sizeof (int)]; rnd.NextBytes(buffer); return BitConverter.ToInt32(buffer, 0); } /// <summary> /// Returns a random number of the full Int64 range. /// </summary> /// <param name="rnd">The random number generator.</param> /// <returns> /// A 64-bit signed integer of the full range, including 0, negative numbers, /// <see cref="Int64.MaxValue"/> and <see cref="Int64.MinValue"/>. /// </returns> /// <seealso cref="NextInt64"/> public static long NextFullRangeInt64(this System.Random rnd) { var buffer = new byte[sizeof (long)]; rnd.NextBytes(buffer); return BitConverter.ToInt64(buffer, 0); } /// <summary> /// Returns a nonnegative decimal floating point random number less than 1.0. /// </summary> /// <param name="rnd">The random number generator.</param> /// <returns> /// A decimal floating point number greater than or equal to 0.0, and less than 1.0; that is, /// the range of return values includes 0.0 but not 1.0. /// </returns> public static decimal NextDecimal(this System.Random rnd) { decimal candidate; // 50.049 % chance that the number is below 1.0. Try until we have one. // Guarantees that any decimal in the interval can // indeed be reached, with uniform probability. do { candidate = new decimal( rnd.NextFullRangeInt32(), rnd.NextFullRangeInt32(), rnd.NextFullRangeInt32(), false, 28); } while (candidate >= 1.0m); return candidate; } }
其使用非常简单,这里就不再举例子。这种扩展大家也应该写过,后面几篇文章将介绍Math.NET中实现的其他算法的随机数发生器。请关注
3.资源
源码下载:http://www.cnblogs.com/asxinyu/p/4264638.html如果本文显示有问题,请参考本文原文:http://www.cnblogs.com/asxinyu/p/4301544.html
相关文章推荐
- 【原创】开源Math.NET基础数学类库使用(12)C#随机数扩展方法
- 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
- 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
- 【原创】开源Math.NET基础数学类库使用(14)C#生成安全的随机数
- 【原创】开源Math.NET基础数学类库使用(04)C#解析Matrix Marke数据格式
- 【原创】开源Math.NET基础数学类库使用(16)C#计算矩阵秩
- 【原创】开源Math.NET基础数学类库使用(11)C#计算相关系数
- 【原创】开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
- 【原创】开源Math.NET基础数学类库使用(05)C#解析Delimited Formats数据格式
- 【原创】开源Math.NET基础数学类库使用(10)C#进行基本数据统计
- 【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
- 开源Math.NET基础数学类库使用(14)C#生成安全的随机数
- 【原创】开源Math.NET基础数学类库使用(10)C#进行基本数据统计
- 开源Math.NET基础数学类库使用(12)C#随机数扩展方法
- 【原创】开源Math.NET基础数学类库使用(08)C#进行数值积分
- 【原创】开源Math.NET基础数学类库使用(08)C#进行数值积分
- 【原创】开源Math.NET基础数学类库使用(11)C#计算相关系数
- 【原创】开源Math.NET基础数学类库使用(16)C#计算矩阵秩
- 【原创】开源Math.NET基础数学类库使用(05)C#解析Delimited Formats数据格式
- 【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数