【问题标题】:How can I get the seed from a Random already created如何从已创建的 Random 中获取种子
【发布时间】:2016-03-16 08:33:46
【问题描述】:

我必须能够重复使用我的代码进行的实验,它会生成一些随机数,并且我需要获取我的新 random() 语句的初始化值。我有这句话来制作我使用的随机对象

Dim r As Random = New Random()

正如我所读,它从系统日期时间获取初始化值。如果实验成功,我需要能够重复它。我怎样才能得到初始化编号才能做到:

 Dim r As Random = New Random(OldInitializationValue)

我认为每次执行我的应用程序时我都必须自己创建一个 Initialization 值,但如果有一种方法可以保存它,我会很高兴知道它。

提前感谢您的回答。

【问题讨论】:

  • 你不能。这就是“随机”的意义所在。如果您想要可重复的序列,您还需要在第一次调用中明确指定种子
  • 显然种子值可以由构造函数显式设置;是否可以选择将种子值存储在其他地方以供以后参考?
  • PS:R 中的任何课程都说明您需要存储种子以实现可重复性。他们还解释说,您不能使用加密 RNG,因为它们不可重复
  • 如果你想对某事使用相同的随机值集,你可以使用 Mersenne Twister。它是否适用于您正在做的事情尚不清楚。

标签: .net vb.net random


【解决方案1】:

Random 不公开初始种子,它甚至不存储它,因此无法检索它。所以你必须使用constructor来获取种子并自己存储。

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 implementation of Random 甚至不会在任何地方“保存”种子。它立即使用它然后丢弃它。
  • @xanatos:已添加,谢谢。代码看起来有点奇怪。为什么在构造函数末尾用 1 覆盖种子值?出于安全原因?
猜你喜欢
  • 2011-08-25
  • 1970-01-01
  • 2020-11-05
  • 2016-08-12
  • 2014-08-07
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 2021-04-29
相关资源
最近更新 更多