C#的Random 类使用说明
一:C#的Random定义
表示伪随机数生成器,这是一种能够产生满足某些随机性统计要求的数字序列的算法。
二:C#的Random的构造函数
构造函数有两种方式,带参数和不带参数的,public Random(): 不带参数的是使用与时间相关的默认种子值,初始化 System.Random 类的新实例。public Random(int Seed):带参数的是使用指定的种子值初始化 System.Random 类的新实例。用来计算伪随机数序列起始值的数字。 如果指定的是负数,则使用其绝对值。
重载 | 重载说明 |
---|---|
Random() | 使用默认种子值初始化 Random 类的新实例。 |
Random(Int32) | 使用指定的种子值初始化 Random 类的新实例。 |
三:C#的Random的方法
方法 | 描述 |
---|---|
Next() | 每次产生一个不同的随机正整数 |
Next(int max Value) | 产生一个比 max Value(2,147,483,647) 小的正整数 |
Next(int min Value,int max Value) | 产生一个 minValue~maxValue 的正整数,但不包含 maxValue |
NextDouble() | 产生一个0.0~1.0的浮点数 |
NextBytes(byte[]) | 用随机数填充指定字节数的数组(0-255) |
3.1:Random.Next() 方法
重载 | 重载说明 |
---|---|
Next() | 返回一个非负随机整数(返回一个大于或等于零而小于2,147,483,647的数)。 |
Next(Int32) | 返回一个小于所指定值的非负随机整数(注意,指定值不能大于2,147,483,647)。 |
Next(Int32, Int32) | 返回在指定范围内的任意整数。 |
- Random.Next() 的使用
Random Ra = new Random();
int num = Ra.Next();
//返回非负随机数Next,大于等于零且小于Int32.MaxValue(2,147,483,647) 的 32 位带符号整数
Console.WriteLine(num);
运行结果:
2114319875 |
- Random.Next(Int32) 的使用
Random Ra = new Random();
int num = Ra.Next(10);
//返回非负随机数Next,大于等于零且小于 10 的 32 位带符号整数
Console.WriteLine(num);
运行结果:
5 |
- Random.Next(Int32, Int32)的使用
Random Ra = new Random();
int num = Ra.Next(10,100);
//返回非负随机数Next,介于10到100 的 32 位带符号整数
Console.WriteLine(num);
运行结果:
52 |
3.2:Random.NextDouble() 方法
Random Ra = new Random();
//返回一个大于或等于 0.0 且小于 1.0 的随机浮点数
for (int j = 0; j < 6; j++)
{
Console.WriteLine(" {0,10} ", Ra.NextDouble());
}
运行结果:
0.683618851324366 0.223386951826227 0.330973770623549 0.177474327002407 0.697770430565705 0.752204630408531 |
3.3:Random.NextBytes() 方法
Random Ran = new Random();
Byte[] Num = new Byte[10];
Ran.NextBytes(Num);
Console.WriteLine("这个随机数的数组是: ");
for (int i = 0; i < 10; i++)
{
Console.WriteLine("{0}: {1}", i, Num[i]);
}
运行结果:
这个随机数的数组是: 0: 172 1: 143 2: 59 3: 117 4: 219 5: 124 6: 138 7: 232 8: 68 9: 2 |
四:C#的Random的应用注意
下面举例 Random 使用类构造函数创建对象,该类构造函数采用 seed 参数并生成随机整数和双精度序列。 该示例说明了在 Random 再次创建具有构造函数和 seed 参数的对象时,会生成相同的序列。
为不同的对象提供相同的种子值 Random 会导致每个实例生成相同的随机数序列。 这种情况通常在测试依赖随机数生成器的应用时完成。
生成唯一种子值的一种方法是使其与时间相关。 例如,从系统时钟派生种子值,因为 Random() 重载会。 但是,系统时钟可能没有足够的分辨率来为此构造函数提供不同的种子值调用。 在 .NET Framework 中,这会生成随机数字生成器,生成相同的伪随机数序列,如下示例中的FixedSeedRandoms函数所示。 若要防止出现这种情况,请应用一种算法来区分每个调用中的种子值,或调用 Thread.Sleep 方法以确保为每个构造函数提供不同的种子值。
static void Main()
{
FixedSeedRandoms(123);
FixedSeedRandoms(123);
FixedSeedRandoms(456);
FixedSeedRandoms(456);
AutoSeedRandoms();
AutoSeedRandoms();
AutoSeedRandoms();
}
// 从指定的随机对象生成随机数.
static void RunIntNDoubleRandoms(Random randObj)
{
// 生成前六个随机整数.
for (int j = 0; j < 6; j++)
Console.Write(" {0,10} ", randObj.Next());
Console.WriteLine();
// 生成前六个随机双精度.
for (int j = 0; j < 6; j++)
Console.Write(" {0:F8} ", randObj.NextDouble());
Console.WriteLine();
}
// 使用指定的种子创建一个Random对象。
static void FixedSeedRandoms(int seed)
{
Console.WriteLine( "\n来自随机对象的随机数 " + "seed = {0}:", seed);
Random fixRand = new Random(seed);
RunIntNDoubleRandoms(fixRand);
}
// 使用计时器生成的种子创建随机对象.
static void AutoSeedRandoms()
{
// 等待以允许计时器前进
Thread.Sleep(20);
Console.WriteLine( "\n来自随机对象的随机数 " + "使用自动生成的种子: ");
Random autoRand = new Random();
RunIntNDoubleRandoms(autoRand);
}
运行结果:
来自随机对象的随机数 seed = 123: 2114319875 1949518561 1596751841 1742987178 1586516133 103755708 0.01700087 0.14935942 0.19470390 0.63008947 0.90976122 0.49519146/font> 来自随机对象的随机数 seed = 123: 2114319875 1949518561 1596751841 1742987178 1586516133 103755708 0.01700087 0.14935942 0.19470390 0.63008947 0.90976122 0.49519146 来自随机对象的随机数 seed = 456: 2044805024 1323311594 1087799997 1907260840 179380355 120870348 0.21988117 0.21026556 0.39236514 0.42420498 0.24102703 0.47310170 来自随机对象的随机数 seed = 456: 2044805024 1323311594 1087799997 1907260840 179380355 120870348 0.21988117 0.21026556 0.39236514 0.42420498 0.24102703 0.47310170 来自随机对象的随机数 使用自动生成的种子: 668418138 602631887 2082322738 551551983 1085932562 1878544169 0.83360992 0.09931033 0.21526970 0.04432701 0.20024430 0.11887279 来自随机对象的随机数 使用自动生成的种子: 61990347 1438852920 724287785 186852950 2047025280 1802802021 0.17142425 0.15321122 0.17420411 0.84436214 0.77562120 0.10173503 来自随机对象的随机数 使用自动生成的种子: 1858102103 153109930 1765430500 619880054 1558013396 2035733345 0.89227471 0.67847726 0.02995462 0.37562860 0.82657912 0.81245171 |