我有一个伪随机数生成器(PRNG),它具有很好的属性,它使用 6 个UInt32
s 作为状态。我需要想出一个合理的方法来播种。两个明显的可能性是:1)使用它们生成六个随机数System.Random
并将它们用作种子;2) 用 生成两个GUID
s Guid.NewGuid()
。哪个会更好?
我不需要加密安全。
如果需要UInt32
,那Random
是不是更方便?just Next()
, Next()
, Next()
etc (and cast)... (Random
但是使用相同的实例 - 不要new Random()
每次都创建)。
这取决于它是否提供足够的随机性的意图。既然这只是种子,应该没问题...
不幸的是 System.Random() 也需要一个种子值。默认情况下,它使用当前的 Tick 计数,该计数是可预测的,实际上不是随机的。所以你需要一个 Random 的种子,它会引导你回到原来的问题......
我以前从未使用过 Guid.GetHashCode() 作为种子,但我的 2 秒反应是这听起来不错。
无论您是否需要加密安全,为什么不直接使用 System.Security.Cryptography.RNGCryptoServiceProvider 来生成您的随机数?除非有特定的原因,比如它太慢,否则我看不出你为什么不使用它。由于它是一个加密随机生成器,您将获得更好的随机数,并且不必担心播种它。
试试这个以获得你的种子价值......
(UInt32)Math.Pow(System.DateTime.Now.TimeOfDay.TotalMilliseconds, 11.0 / 7.0)
它只是将当前时间的毫秒数提高到 11/7 次方,这只是任意的。您可以尝试其他分数,看看它们是否更适合您。
请注意,如果您的分数的十进制等值大于约 2.5,您可能会出现溢出并且您的种子值将为零。:(
我已经使用了一段时间,它似乎提供了相当不错的种子值。