如何从已创建的随机数生成器中获取种子

3

我需要能够重复使用我的代码进行实验,它生成了一些随机数,我需要得到我新的random()语句的初始化值。我有这个语句来创建我使用的随机对象。

Dim r As Random = New Random()

据我了解,它从系统日期时间获取初始化值。如果实验成功,我需要能够重复进行。如何获取初始化数字以便执行以下操作:

 Dim r As Random = New Random(OldInitializationValue)

我想每次执行我的应用程序时都需要自己创建一个初始化值,但如果有一种保存它的方法,我会很高兴知道。

提前感谢您的回答。


1
你不能这样做。这就是“随机”的意义所在。如果你想要可重复的序列,你需要在第一次调用时明确指定种子。 - Panagiotis Kanavos
1
显然,种子值可以通过构造函数明确设置;将种子值存储在其他地方以便稍后引用是否是一个选项? - Codor
PS:任何R课程都会解释,为了可重复性,您需要存储种子。他们还解释说,您不能使用加密随机数生成器,因为它们不可重复。 - Panagiotis Kanavos
如果你想在某件事中使用相同的随机值集合,你可以使用Mersenne Twister。它是否适用于你正在做的事情尚不清楚。 - Ňɏssa Pøngjǣrdenlarp
1个回答

6

Random没有公开初始种子,它甚至不存储种子,因此无法检索。因此,您必须使用带有种子的构造函数并自己存储种子。

Dim mySeed As Int32 = Environment.TickCount ' store it somewhere '

Dim myRandom = New Random(mySeed)
For i As Int32 = 1 To 10
    Console.WriteLine(myRandom.Next(1, 100))
Next

' somehwere else
myRandom = New Random(mySeed)
For i As Int32 = 1 To 10
    Console.WriteLine(myRandom.Next(1, 100))
Next

现在,您可以始终使用相同的种子创建随机实例,以获得相同的伪随机值序列。


“Random不公开初始种子”。从技术上讲,Microsoft实现的Random甚至没有在任何地方“保存”种子。它立即使用并丢弃它。 - xanatos
@xanatos:已添加,谢谢。代码看起来有点奇怪。为什么种子值在构造函数末尾被重写为1?出于安全原因吗? - Tim Schmelter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接