在.NET中播种随机数生成器

时间:2008-12-15 20:42:55

标签: c# random

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

需要加密安全。

4 个答案:

答案 0 :(得分:4)

如果需要UInt32,那么Random会更方便吗?只是Next()Next()Next()等(和强制转换)...(但使用相同的Random实例 - 每次都不要创建new Random()

这取决于意图是否提供足够的随机性。因为这只是种子,所以应该没问题......

答案 1 :(得分:4)

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

我之前没有使用Guid.GetHashCode()作为种子,但我的2秒反应是听起来不是一个坏主意。

答案 2 :(得分:4)

您是否需要加密安全性,为什么不使用System.Security.Cryptography.RNGCryptoServiceProvider生成随机数?除非有特殊原因,比如它太慢,我不明白为什么你不会使用它。由于它是一个加密随机生成器,你可以得到更好的随机数,而不必担心播种它。

答案 3 :(得分:0)

试试这个种子价值......

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

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

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

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