如何为随机生成器生成良好的随机种子?

时间:2012-05-18 13:28:00

标签: c++ visual-c++ random seed

我当然不能使用随机发生器。目前我正在从unixtime()+ microtime()创建CRC32哈希。

除了哈希时间()+ microtime()之外,还有更聪明的方法吗?

我对结果并不完全满意,但我预计它会更随机,但我可以看到它中的强大模式,直到我添加了更多调用MicroTime()但它变得慢得多,所以我是寻找一些最佳的方法。

这个愚蠢的代码产生了迄今为止我能做的最好的输出,计算是必要的,或者我可以在输出中看到一些模式:

starthash(crc32);
    addtohash(crc32, MicroTime());
    addtohash(crc32, time(NULL)); // 64bit
    addtohash(crc32, MicroTime()/13.37f);
    addtohash(crc32, (10.0f-MicroTime())*1337.0f);
    addtohash(crc32, (11130.0f-MicroTime())/1313137.0f);
endhash(crc32);

MicroTime()返回程序启动后经过的微秒。我已经将addtohash()重载到每种可能的类型。

我宁愿选择非库解决方案,也许只需要~10行代码,我不想安装大型库因为我实际上并不需要这么多东西,而且我对它更感兴趣代码,而不仅仅是从函数调用中使用它。

2 个答案:

答案 0 :(得分:3)

如果有任何疑问,请在Windows上从CryptGenRandom获取种子,或者在* NIX系统上阅读dev/randomdev/urandom

这对你的目的来说可能有点过头了,但是除非它导致性能问题,否则就像时间一样搞乱低熵源。

这不太可能是不足的。如果您正在编写真正需要高质量安全随机数据的代码,并且在问题中没有提及,那么,您得到的是您应得的; - )

答案 1 :(得分:0)

你可以查看lfsr&伪随机生成器..通常这是一个难以解决的解决方案,但您可以轻松实现自己的软件lfsr