.NET类库之Random 类

表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备。

命名空间:  System
程序集:  mscorlib(在 mscorlib.dll 中)

C#
 
[SerializableAttribute]
[ComVisibleAttribute(true)]
public class Random
 

伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,因为它们是用一种确定的数学算法选择的,但是从实用的角度而言,其随机程度已足够了。Random 类的当前实现是基于 Donald E. Knuth 的减随机数生成器算法的。

随机数的生成是从种子值开始。如果反复使用同一个种子,就会生成相同的数字系列。产生不同序列的一种方法是使种子值与时间相关,从而对于 Random 的每个新实例,都会产生不同的系列。默认情况下,Random 类的无参数构造函数使用系统时钟生成其种子值,而参数化构造函数可根据当前时间的刻度数采用 Int32 值。

但由于时钟分辨率有限,频繁地创建不同的 Random 对象会创建出产生相同随机数序列的随机数生成器。通过创建单个而不是多个 Random 对象可以避免此问题。

要提高性能,请创建一个 Random,以便随着时间的推移可以生成很多随机数,而不要重复新建 Random 来生成一个随机数。

在 .NET Framework 1.0 和 1.1 版中,派生自 Random 的类的最小实现需要重写 Sample 方法,以定义用于生成随机数的新算法或修改算法。然后,该派生类便可依赖 Random.Next()、Random.Next(Int32)、Random.Next(Int32, Int32)、NextBytes 和 NextDouble 方法的基类实现来调用 Sample 方法的派生类实现。

在 .NET Framework 2.0 及更高版本中,Random.Next()()()、Random.Next(Int32, Int32) 和 NextBytes 方法的行为发生了更改,因此这些方法不必再调用 Sample 方法的派生类实现。因此,派生自 Random 并且面向 .NET Framework 2.0 及更高版本的类还应重写这三种方法。

下面的代码示例使用类构造函数的不同重载创建 Random 对象,并通过这些对象生成随机整数和双精度数的序列。

// Example of the Random class constructors and Random.NextDouble( ) 
// method.
using System;
using System.Threading;
 
public class RandomObjectDemo  
{
    // Generate random numbers from the specified Random object.
    static void RunIntNDoubleRandoms( Random randObj )
    {
        // Generate the first six random integers.
        for( int j = 0; j < 6; j++ )
            Console.Write( " {0,10} ", randObj.Next( ) );
        Console.WriteLine( );
 
        // Generate the first six random doubles.
        for( int j = 0; j < 6; j++ )
            Console.Write( " {0:F8} ", randObj.NextDouble( ) );
        Console.WriteLine( );
    }
 
    // Create a Random object with the specified seed.
    static void FixedSeedRandoms( int seed )
    {
        Console.WriteLine( 
            "\nRandom numbers from a Random object with " +
            "seed = {0}:", seed );
        Random fixRand = new Random( seed );
 
        RunIntNDoubleRandoms( fixRand );
    }
 
    // Create a random object with a timer-generated seed.
    static void AutoSeedRandoms( )
    {
        // Wait to allow the timer to advance.
        Thread.Sleep( 1 );
 
        Console.WriteLine( 
            "\nRandom numbers from a Random object " +
            "with an auto-generated seed:" );
        Random autoRand = new Random( );
 
        RunIntNDoubleRandoms( autoRand );
    }
 
    static void Main( )
    {    
        Console.WriteLine(
            "This example of the Random class constructors and " +
            "Random.NextDouble( ) \n" +
            "generates the following output.\n" );
        Console.WriteLine(
            "Create Random objects, and then generate and " +
            "display six integers and \nsix doubles from each.");
 
        FixedSeedRandoms( 123 );
        FixedSeedRandoms( 123 );
 
        FixedSeedRandoms( 456 );
        FixedSeedRandoms( 456 );
 
        AutoSeedRandoms( );
        AutoSeedRandoms( );
        AutoSeedRandoms( );
    }
}
 
/*
This example of the Random class constructors and Random.NextDouble( )
generates the following output.
Create Random objects, and then generate and display six integers and
six doubles from each.
Random numbers from a Random object with seed = 123:
 2114319875  1949518561  1596751841  1742987178  1586516133   103755708
 0.01700087  0.14935942  0.19470390  0.63008947  0.90976122  0.49519146
Random numbers from a Random object with seed = 123:
 2114319875  1949518561  1596751841  1742987178  1586516133   103755708
 0.01700087  0.14935942  0.19470390  0.63008947  0.90976122  0.49519146
Random numbers from a Random object with seed = 456:
 2044805024  1323311594  1087799997  1907260840   179380355   120870348
 0.21988117  0.21026556  0.39236514  0.42420498  0.24102703  0.47310170
Random numbers from a Random object with seed = 456:
 2044805024  1323311594  1087799997  1907260840   179380355   120870348
 0.21988117  0.21026556  0.39236514  0.42420498  0.24102703  0.47310170
Random numbers from a Random object with an auto-generated seed:
  380213349   127379247  1969091178  1983029819  1963098450  1648433124
 0.08824121  0.41249688  0.36445811  0.05637512  0.62702451  0.49595560
Random numbers from a Random object with an auto-generated seed:
  861793304  2133528783  1947358439   124230908   921262645  1087892791
 0.56880819  0.42934091  0.60162512  0.74388610  0.99432979  0.30310005
Random numbers from a Random object with an auto-generated seed:
 1343373259  1992194672  1925625700   412915644  2026910487   527352458
 0.04937517  0.44618494  0.83879212  0.43139707  0.36163507  0.11024451
*/
posted @ 2008-06-30 13:05  superfang  阅读(753)  评论(0编辑  收藏  举报