我有一个pseudorandom number generator(PRNG),它有很好的属性,使用六个UInt32
作为状态。我需要想出一个合理的方法来播种它。两个明显的可能性是:1)使用System.Random
生成六个随机数并将它们用作种子; 2)使用GUID
生成两个Guid.NewGuid()
s。哪个更好?
我不需要加密安全。
答案 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,则可能会出现溢出,种子值将为零。 :(
我已经使用了一段时间,它似乎提供了相当不错的种子值。