Random 构造函数
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
初始化 Random 类的新实例。
重载
Random() |
使用默认种子值初始化 Random 类的新实例。 |
Random(Int32) |
使用指定的种子值初始化 Random 类的新实例。 |
Random()
使用默认种子值初始化 Random 类的新实例。
public:
Random();
public Random ();
Public Sub New ()
示例
下面的示例使用无参数构造函数实例化三个 Random 对象,并为每个对象显示五个随机整数的序列。 如果它在 .NET Framework 上运行,因为前两个 Random 对象是连续创建的,所以它们是使用基于系统时钟的相同种子值进行实例化的,因此,它们生成相同的随机数序列。 另一方面,如果 Random 调用方法导致两秒钟的延迟,则会调用第三个对象的无参数构造函数 Thread.Sleep 。 因为这会为第三个对象产生不同的种子值 Random ,所以它会产生不同的随机数字序列。
using System;
using System.Threading;
public class RandomNumbers
{
public static void Main()
{
Random rand1 = new Random();
Random rand2 = new Random();
Thread.Sleep(2000);
Random rand3 = new Random();
ShowRandomNumbers(rand1);
ShowRandomNumbers(rand2);
ShowRandomNumbers(rand3);
}
private static void ShowRandomNumbers(Random rand)
{
Console.WriteLine();
byte[] values = new byte[5];
rand.NextBytes(values);
foreach (byte value in values)
Console.Write("{0, 5}", value);
Console.WriteLine();
}
}
// The example displays an output similar to the following:
// 28 35 133 224 58
//
// 28 35 133 224 58
//
// 32 222 43 251 49
open System
open System.Threading
let showRandomNumbers (rand: Random) =
printfn ""
let values = Array.zeroCreate 5
rand.NextBytes values
for value in values do
printf "%5i" value
printfn ""
let rand1 = Random()
let rand2 = Random()
Thread.Sleep 2000
let rand3 = Random()
showRandomNumbers rand1
showRandomNumbers rand2
showRandomNumbers rand3
// The example displays an output similar to the following:
// 28 35 133 224 58
//
// 28 35 133 224 58
//
// 32 222 43 251 49
Imports System.Threading
Module RandomNumbers
Public Sub Main()
Dim rand1 As New Random()
Dim rand2 As New Random()
Thread.Sleep(2000)
Dim rand3 As New Random()
ShowRandomNumbers(rand1)
ShowRandomNumbers(rand2)
ShowRandomNumbers(rand3)
End Sub
Private Sub ShowRandomNumbers(rand As Random)
Console.WriteLine()
Dim values(4) As Byte
rand.NextBytes(values)
For Each value As Byte In values
Console.Write("{0, 5}", value)
Next
Console.WriteLine()
End Sub
End Module
' The example displays an output similar to the following:
' 28 35 133 224 58
'
' 28 35 133 224 58
'
' 32 222 43 251 49
注解
在 .NET Framework 中,默认种子值派生自系统时钟,后者具有有限的分辨率。 因此, Random 通过调用无参数的构造函数而创建的不同对象具有相同的默认种子值,因此会产生相同的随机数集。 您可以通过使用单个 Random 对象生成所有随机数来避免此问题。 还可以通过生成自己的随机种子值并将其传递给构造函数来解决此情况 Random(Int32) 。 有关详细信息,请参阅 Random(Int32) 构造函数。
在 .NET Core 中,默认种子值由线程静态的伪随机数生成器生成,因此,上述限制不适用。 Random连续创建的不同对象在 .Net Core 中生成不同的随机数集。
如果希望随机数生成器生成一系列随机数字,请调用此构造函数。 若要生成与不同随机数生成器相同的固定随机数序列,请 Random(Int32) 使用固定种子值调用构造函数。 Random测试使用随机数字的应用时,经常使用此构造函数重载。
在实例化随机数生成器后,调用各个 Random 方法(如 Next() 或 NextDouble() )以生成随机数字。
适用于
Random(Int32)
使用指定的种子值初始化 Random 类的新实例。
public:
Random(int Seed);
public Random (int Seed);
new Random : int -> Random
Public Sub New (Seed As Integer)
参数
- Seed
- Int32
用来计算伪随机数序列起始值的数字。 如果指定的是负数,则使用其绝对值。
示例
下面的示例 Random 使用类构造函数创建对象,该类构造函数采用 seed 参数并生成随机整数和双精度序列。 该示例说明了在 Random 再次创建具有构造函数和 seed 参数的对象时,将生成相同的序列。
// Example of the Random class constructors and Random::NextDouble()
// method.
using namespace System;
using namespace System::Threading;
// Generate random numbers from the specified Random object.
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.
void FixedSeedRandoms(int seed)
{
Console::WriteLine("\nRandom numbers from a Random object with seed = {0}:", seed);
Random^ fixRand = gcnew Random(seed);
RunIntNDoubleRandoms(fixRand);
}
// Create a random object with a timer-generated seed.
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 = gcnew Random;
RunIntNDoubleRandoms(autoRand);
}
int main()
{
Console::WriteLine("This example of the Random class constructors and Random"
"::NextDouble() \ngenerates 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 an output similar to the following:
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:
1624372556 1894939458 302472229 588108304 23919954 1085111949
0.14595512 0.30162298 0.92267372 0.55707657 0.25430079 0.74143239
Random numbers from a Random object with an auto-generated seed:
2105952511 1753605347 280739490 876793040 1129567796 524571616
0.62652210 0.31846701 0.15984073 0.24458755 0.62160607 0.54857684
Random numbers from a Random object with an auto-generated seed:
440048819 1612271236 259006751 1165477776 87731991 2111514930
0.10708907 0.33531104 0.39700773 0.93209853 0.98891135 0.35572129
*/
// 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 an output similar to the following:
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
*/
// Example of the Random class constructors and Random.NextDouble()
// method.
open System
open System.Threading
// Generate random numbers from the specified Random object.
let runIntNDoubleRandoms (randObj: Random) =
// Generate the first six random integers.
for _ = 1 to 6 do
printf $" {randObj.Next(),10} "
printfn ""
// Generate the first six random doubles.
for _ = 1 to 6 do
printf $" {randObj.NextDouble():F8} "
printfn ""
let fixedSeedRandoms seed =
printfn $"\nRandom numbers from a Random object with seed = %i{seed}:"
let fixRand = Random seed
runIntNDoubleRandoms fixRand
let autoSeedRandoms () =
// Wait to allow the timer to advance.
Thread.Sleep 1
printfn "\nRandom numbers from a Random object with an auto-generated seed: "
let autoRand = Random ()
runIntNDoubleRandoms autoRand
printfn
"""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."""
fixedSeedRandoms 123
fixedSeedRandoms 123
fixedSeedRandoms 456
fixedSeedRandoms 456
autoSeedRandoms ()
autoSeedRandoms ()
autoSeedRandoms ()
(*
This example of the Random class constructors and Random.NextDouble()
generates an output similar to the following:
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
*)
' Example of the Random class constructors and Random.NextDouble()
' method.
Imports System.Threading
Module RandomObjectDemo
' Generate random numbers from the specified Random object.
Sub RunIntNDoubleRandoms(randObj As Random)
' Generate the first six random integers.
Dim j As Integer
For j = 0 To 5
Console.Write(" {0,10} ", randObj.Next())
Next j
Console.WriteLine()
' Generate the first six random doubles.
For j = 0 To 5
Console.Write(" {0:F8} ", randObj.NextDouble())
Next j
Console.WriteLine()
End Sub
' Create a Random object with the specified seed.
Sub FixedSeedRandoms(seed As Integer)
Console.WriteLine(vbCrLf & _
"Random numbers from a Random object with " & _
"seed = {0}:", seed)
Dim fixRand As New Random(seed)
RunIntNDoubleRandoms(fixRand)
End Sub
' Create a random object with a timer-generated seed.
Sub AutoSeedRandoms()
' Wait to allow the timer to advance.
Thread.Sleep(1)
Console.WriteLine(vbCrLf & _
"Random numbers from a Random object " & _
"with an auto-generated seed:")
Dim autoRand As New Random()
RunIntNDoubleRandoms(autoRand)
End Sub
Sub Main()
Console.WriteLine(_
"This example of the Random class constructors " & _
"and Random.NextDouble() " & vbCrLf & _
"generates the following output." & vbCrLf)
Console.WriteLine("Create Random " & _
"objects, and then generate and display six " & _
"integers and " & vbCrLf & "six doubles from each.")
FixedSeedRandoms(123)
FixedSeedRandoms(123)
FixedSeedRandoms(456)
FixedSeedRandoms(456)
AutoSeedRandoms()
AutoSeedRandoms()
AutoSeedRandoms()
End Sub
End Module
' This example of the Random class constructors and Random.NextDouble()
' generates an output similar to the following:
'
' 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:
' 1920831619 1346865774 2006582766 1968819760 332463652 110770792
' 0.71326689 0.50383335 0.50446082 0.66312569 0.94517193 0.58059287
'
' Random numbers from a Random object with an auto-generated seed:
' 254927927 1205531663 1984850027 110020849 1438111494 1697714106
' 0.19383387 0.52067738 0.74162783 0.35063667 0.31247720 0.38773733
'
' Random numbers from a Random object with an auto-generated seed:
' 736507882 1064197552 1963117288 398705585 396275689 1137173773
' 0.67440084 0.53752140 0.97879483 0.03814764 0.67978248 0.19488178
注解
为不同的对象提供相同的种子值 Random 会导致每个实例生成相同的随机数序列。 这种情况通常在测试依赖随机数生成器的应用时完成。
如果应用程序需要不同的随机数序列,请用不同的种子值重复调用此构造函数。 生成唯一种子值的一种方法是使其与时间相关。 例如,从系统时钟派生种子值,因为 Random() 重载会。 但是,系统时钟可能没有足够的分辨率来为此构造函数提供不同的种子值调用。 在 .NET Framework 中,这会生成随机数字生成器,生成相同的伪随机数序列,如以下示例中的前两个 Random 对象所示。 若要防止出现这种情况,请应用一种算法来区分每个调用中的种子值,或调用 Thread.Sleep 方法以确保为每个构造函数提供不同的种子值。
using System;
using System.Threading;
public class Example
{
public static void Main()
{
Random rand1 = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);
Random rand2 = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);
Thread.Sleep(20);
Random rand3 = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);
ShowRandomNumbers(rand1);
ShowRandomNumbers(rand2);
ShowRandomNumbers(rand3);
}
private static void ShowRandomNumbers(Random rand)
{
Console.WriteLine();
byte[] values = new byte[4];
rand.NextBytes(values);
foreach (var value in values)
Console.Write("{0, 5}", value);
Console.WriteLine();
}
}
// The example displays output similar to the following:
// 145 214 177 134 173
//
// 145 214 177 134 173
//
// 126 185 175 249 157
open System
open System.Threading
let showRandomNumbers (rand: Random) =
printfn ""
let values = Array.zeroCreate 5
rand.NextBytes values
for value in values do
printf "%5i" value
printfn ""
let rand1 = Random(DateTime.Now.Ticks &&& 0x0000FFFFL |> int)
let rand2 = Random(DateTime.Now.Ticks &&& 0x0000FFFFL |> int)
Thread.Sleep 20
let rand3 = Random(DateTime.Now.Ticks &&& 0x0000FFFFL |> int)
showRandomNumbers rand1
showRandomNumbers rand2
showRandomNumbers rand3
// The example displays output similar to the following:
// 145 214 177 134 173
//
// 145 214 177 134 173
//
// 126 185 175 249 157
Imports System.Threading
Module RandomNumbers
Public Sub Main()
Dim rand1 As New Random(CInt(Date.Now.Ticks And &h0000FFFF))
Dim rand2 As New Random(CInt(Date.Now.Ticks And &h0000FFFF))
Thread.Sleep(20)
Dim rand3 As New Random(CInt(Date.Now.Ticks And &h0000FFFF))
ShowRandomNumbers(rand1)
ShowRandomNumbers(rand2)
ShowRandomNumbers(rand3)
End Sub
Private Sub ShowRandomNumbers(rand As Random)
Console.WriteLine()
Dim values(4) As Byte
rand.NextBytes(values)
For Each value As Byte In values
Console.Write("{0, 5}", value)
Next
Console.WriteLine()
End Sub
End Module
' The example displays output similar to the following:
' 145 214 177 134 173
'
' 145 214 177 134 173
'
' 126 185 175 249 157
另一种方法是实例化单个 Random 对象,用于在应用程序中生成所有随机数。 这会产生略微改善的性能,因为实例化随机数生成器相当昂贵。