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

命名空间:  System
程序集:


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
*/