C# Random类 伪随机数生成器

发布时间 2023-05-09 14:19:08作者: 夜店耍流氓

  Random类表示伪随机数生成器,它是一种能够产生满足某些随机性统计要求的数字序列的设备,其方法如下表:

Random类方法
方 法 说 明
Next 已重载。返回随机数
NextBytes 用随机数填充指定字节数组的元素
NextDouble 返回一个介于0.0和1.0之间的随机数
Sample 返回一个介于0.0和1.0之间的随机数
ToString 返回表示当前Object的String (继承自Object)

  Random类是一个产生伪随机数字的类,它的构造函数有两种:一个是直接new Random(),另外一个是new Random(Int32);前者是根据触发那一刻的系统时间作为种子,来产生一个随机数字,后者可以自己设定触发的种子,一般都是用UnCheck((int)DateTime.Now.Ticks)作为参数种子。因此,如果计算机运行速度很快,如果触发Random函数间隔时间很短,就有可能产生一样的随机数,因为伪随机的数字在Random的内部产生机制中还是有一定规律的,并非是真正意义上的完全随机。

  对于随机数,大家都知道,计算机不可能产生完全随机的数字。所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似地模拟完全随机数,这种随机数被称作伪随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。伪随机数的选择是从随机种子开始的,所以为了保证每次得到得随机数都足够地“随机”,随机种子得选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生得随机数也会一样。一般的,使用同系统的时间有关的参数作为随机种子,这也是.NET中的随机数发生器默认采用的方法。

  可以使用以下两种方式初始化一个随机数发生器。

  (1)不指定随机种子,系统自动选取当前时间作为随机种子:

           Random ran = new Random();

   (2)可以指定一个int型参数作为随机种子:

          int iSeed = 10;

          Random ro = new Random(iSeed);

          long tick = DateTime.Now.Ticks;

          Random ran = new Random((int)(tick & 0xffffffffL)|(int)(tick>>32));

  这样可以保证99%不是一样。

  之后就可以使用这个ro对象来产生随机数,这时要用到Random.Next()方法。这个方法使用相当灵活,甚至可以指定产生的随机数的上下限。

  不指定上下限的使用如下:

         int result = ro.Next();  //返回非负的一个随机数

  下面的代码指定返回小于100的随机数:

        int result = ro.Next(100); //切记返回的随机数小于100,不包括100.

  而下面这段代码则指定返回值必须在50~100的范围之内:

       int result = ro.Next(50,100);  //切记返回的随机数包括50,但不包括100.

  除了Random.Next()方法之外,Random类还提供了Random.NextDouble()方法产生一个范围在0.0~1.0之间的随机的双精度浮点数:

      double result = ro.NextDouble();