System.Random 类

方法描述

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

语法定义(C# System.Random 类 的用法)

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

构造函数

构造函数名称 构造函数描述
Random() 使用与时间相关的默认种子值,初始化 Random 类的新实例。
Random(Int32) 使用指定的种子值初始化 Random 类的新实例。

成员/方法

方法名称 方法描述
Equals(Object) 确定指定的 Object 是否等于当前的 Object。 (继承自 Object。)
Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。)
GetHashCode 用作特定类型的哈希函数。 (继承自 Object。)
GetType 获取当前实例的 Type。 (继承自 Object。)
MemberwiseClone 创建当前 Object 的浅表副本。 (继承自 Object。)
Next() 返回非负随机数。
Next(Int32) 返回一个小于所指定最大值的非负随机数。
Next(Int32, Int32) 返回一个指定范围内的随机数。
NextBytes 用随机数填充指定字节数组的元素。
NextDouble 返回一个介于 0.0 和 1.0 之间的随机数。
Sample 返回一个介于 0.0 和 1.0 之间的随机数。
ToString 返回表示当前对象的字符串。 (继承自 Object。)

提示和注释

伪随机数是以相同的概率从一组有限的数字中选取的。 所选数字并不具有完全的随机性,因为它们是用一种确定的数学算法选择的,但是从实用的角度而言,其随机程度已足够了。 Random 类的当前实现基于 Donald E 的一个修改版本。 Knuth 的减法随机数生成器算法。 有关更多信息,请参见 D。 E. Knuth。 “The Art of Computer Programming, volume 2: Seminumerical Algorithms”。 Addison-Wesley,Reading,MA,second edition,1981。

随机数的生成是从种子值开始。 如果反复使用同一个种子,就会生成相同的数字系列。 产生不同序列的一种方法是使种子值与时间相关,从而对于 Random 的每个新实例,都会产生不同的系列。 默认情况下,Random 类的无参数构造函数使用系统时钟生成其种子值,而参数化构造函数可根据当前时间的计时周期数采用 Int32 值。 但是,因为时钟的分辨率有限,所以,如果使用无参数构造函数连续创建不同的 Random 对象,就会创建生成相同随机数序列的随机数生成器。 下面的示例演示两个连续实例化的 Random 对象生成相同的随机数序列。

C#

VB

复制

byte[] bytes1 = new byte[100];

byte[] bytes2 = new byte[100];

Random rnd1 = new Random();

Random rnd2 = new Random();

rnd1.NextBytes(bytes1);

rnd2.NextBytes(bytes2);

Console.WriteLine("First Series:");

for (int ctr = bytes1.GetLowerBound(0);

ctr <= bytes1.GetUpperBound(0);

ctr++) {

Console.Write("{0, 5}", bytes1[ctr]);

if ((ctr + 1) % 10 == 0) Console.WriteLine();

}

Console.WriteLine();

Console.WriteLine("Second Series:");

for (int ctr = bytes2.GetLowerBound(0);

ctr <= bytes2.GetUpperBound(0);

ctr++) {

Console.Write("{0, 5}", bytes2[ctr]);

if ((ctr + 1) % 10 == 0) Console.WriteLine();

}

// The example displays the following output to the console:

// First Series:

// 97 129 149 54 22 208 120 105 68 177

// 113 214 30 172 74 218 116 230 89 18

// 12 112 130 105 116 180 190 200 187 120

// 7 198 233 158 58 51 50 170 98 23

// 21 1 113 74 146 245 34 255 96 24

// 232 255 23 9 167 240 255 44 194 98

// 18 175 173 204 169 171 236 127 114 23

// 167 202 132 65 253 11 254 56 214 127

// 145 191 104 163 143 7 174 224 247 73

// 52 6 231 255 5 101 83 165 160 231

//

// Second Series:

// 97 129 149 54 22 208 120 105 68 177

// 113 214 30 172 74 218 116 230 89 18

// 12 112 130 105 116 180 190 200 187 120

// 7 198 233 158 58 51 50 170 98 23

// 21 1 113 74 146 245 34 255 96 24

// 232 255 23 9 167 240 255 44 194 98

// 18 175 173 204 169 171 236 127 114 23

// 167 202 132 65 253 11 254 56 214 127

// 145 191 104 163 143 7 174 224 247 73

// 52 6 231 255 5 101 83 165 160 231

通过创建单个而不是多个 Random 对象可以避免此问题。

若要提高性能,请创建一个随时间推移能生成多个随机数的 Random 对象,而不要反复新建会生成同一个随机数的 Random 对象。

例如,要生成适合于创建随机密码的加密安全随机数,请使用从 System.Security.Cryptography.RandomNumberGenerator 派生的类,如 System.Security.Cryptography.RNGCryptoServiceProvider。

对调用者的说明

在 Random 类中的随机数生成器的实现不能保证.NET Framework 的主版本之间保持相同。。 结果是,应用程序代码不应假定相同的种子将产生不同版本的 .NET 框架中的相同伪随机序列。

对继承者的说明

在 .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 及更高版本的类还应重写这三种方法。

System.Random 类例子

下面的示例创建单个随机数生成器,并调用其 NextBytes、Next 和 NextDouble 方法来生成不同范围内的随机数序列。

// Instantiate random number generator using system-supplied value as seed.
Random rand = new Random();
// Generate and display 5 random byte (integer) values.
byte[] bytes = new byte[4];
rand.NextBytes(bytes);
Console.WriteLine("Five random byte values:");
foreach (byte byteValue in bytes)
   Console.Write("{0, 5}", byteValue);
Console.WriteLine();   
// Generate and display 5 random integers.
Console.WriteLine("Five random integer values:");
for (int ctr = 0; ctr <= 4; ctr++)
   Console.Write("{0,15:N0}", rand.Next());
Console.WriteLine();
// Generate and display 5 random integers between 0 and 100.//
Console.WriteLine("Five random integers between 0 and 100:");
for (int ctr = 0; ctr <= 4; ctr++)
   Console.Write("{0,8:N0}", rand.Next(101));
Console.WriteLine();
// Generate and display 5 random integers from 50 to 100.
Console.WriteLine("Five random integers between 50 and 100:");
for (int ctr = 0; ctr <= 4; ctr++)
   Console.Write("{0,8:N0}", rand.Next(50, 101));
Console.WriteLine();
// Generate and display 5 random floating point values from 0 to 1.
Console.WriteLine("Five Doubles.");
for (int ctr = 0; ctr <= 4; ctr++)
   Console.Write("{0,8:N3}", rand.NextDouble());
Console.WriteLine();
// Generate and display 5 random floating point values from 0 to 5.
Console.WriteLine("Five Doubles between 0 and 5.");
for (int ctr = 0; ctr <= 4; ctr++)
   Console.Write("{0,8:N3}", rand.NextDouble() * 5);
// Sample console output might appear as follows:
//    Five random byte values:
//      194  185  239   54  116
//    Five random integer values:
//        507,353,531  1,509,532,693  2,125,074,958  1,409,512,757    652,767,128
//    Five random integers between 0 and 100:
//          16      78      94      79      52
//    Five random integers between 50 and 100:
//          56      66      96      60      65
//    Five Doubles.
//       0.943   0.108   0.744   0.563   0.415
//    Five Doubles between 0 and 5.
//       2.934   3.130   0.292   1.432   4.369

继承层次结构

System.Object

System.Random

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

线程安全

此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1 受以下版本支持:

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。

相关资源

System 命名空间
MSDN