1

我有一个伪随机数生成器(PRNG),它具有很好的属性,它使用 6 个UInt32s 作为状态。我需要想出一个合理的方法来播种。两个明显的可能性是:1)使用它们生成六个随机数System.Random并将它们用作种子;2) 用 生成两个GUIDs Guid.NewGuid()。哪个会更好?

不需要加密安全。

4

4 回答 4

4

如果需要UInt32,那Random是不是更方便?just Next(), Next(), Next()etc (and cast)... (Random但是使用相同的实例 - 不要new Random()每次都创建)。

这取决于它是否提供足够的随机性的意图。既然这只是种子,应该没问题...

于 2008-12-15T20:48:10.183 回答
4

不幸的是 System.Random() 也需要一个种子值。默认情况下,它使用当前的 Tick 计数,该计数是可预测的,实际上不是随机的。所以你需要一个 Random 的种子,它会引导你回到原来的问题......

我以前从未使用过 Guid.GetHashCode() 作为种子,但我的 2 秒反应是这听起来不错。

于 2008-12-15T20:50:11.647 回答
4

无论您是否需要加密安全,为什么不直接使用 System.Security.Cryptography.RNGCryptoServiceProvider 来生成您的随机数?除非有特定的原因,比如它太慢,否则我看不出你为什么不使用它。由于它是一个加密随机生成器,您将获得更好的随机数,并且不必担心播种它。

于 2008-12-15T21:24:38.940 回答
0

试试这个以获得你的种子价值......

(UInt32)Math.Pow(System.DateTime.Now.TimeOfDay.TotalMilliseconds, 11.0 / 7.0)

它只是将当前时间的毫秒数提高到 11/7 次方,这只是任意的。您可以尝试其他分数,看看它们是否更适合您。

请注意,如果您的分数的十进制等值大于约 2.5,您可能会出现溢出并且您的种子值将为零。:(

我已经使用了一段时间,它似乎提供了相当不错的种子值。

于 2013-02-18T19:21:16.420 回答