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

C++ 如何为随机生成器生成好的随机种子?,c++,visual-c++,random,seed,C++,Visual C++,Random,Seed,我当然不能用随机发生器。目前,我正在从unixtime()+microtime()创建一个CRC32哈希 有没有比哈希时间()+微时间()更聪明的方法 不过,我对结果并不完全满意,我希望它更随机,但我可以看到其中的强模式,直到我向MicroTime()添加了更多调用,但速度慢了很多,所以我正在寻找一些最佳的方法来实现这一点 这段愚蠢的代码生成了迄今为止我所能做出的最佳输出,计算是必要的,或者我可以在输出中看到一些模式: starthash(crc32); addtohash(crc32,

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

有没有比哈希时间()+微时间()更聪明的方法

不过,我对结果并不完全满意,我希望它更随机,但我可以看到其中的强模式,直到我向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行代码,我不想安装大型库,因为我实际上并不需要那么多,我对代码更感兴趣,而不仅仅是通过函数调用使用它。

如果有任何疑问,请从Windows上的
CryptGenRandom
获取种子,或者从*NIX系统上的
dev/random
dev/uradom
读取

对于您的目的来说,这可能有点过头了,但除非它导致性能问题,否则就没有必要像时间一样处理低熵源


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

您可以检查lfsr和伪随机生成器。。通常这是一个硬解决方案,但您可以轻松实现自己的软件lfsr

它应该是多跨平台的?:)种子是否“好”取决于伪随机数据的用途。如果您的唯一要求是PRNG在不同的时间输出不同的数据,那么使用时间就可以了。但要在程序每次运行时为PRNG设定一次种子,您最好使用CryptGenRandom。一个好的CryptPrographic rng应该内置种子设定。任何其他rng都不需要它。@SteveJessop,我可能会在程序的执行时间内多次播种,而不是一次。我以前使用time()作为种子,但我注意到它跟不上我的.exe点击速度,所以我决定让它更随机;)然而,这与当前的问题无关。关于编辑:如果PRNG的输出“不是随机的”,那么这与种子无关。问题在于PRNG算法本身,或者正如您所说,PRNG输出可能是“随机的”,但您使用它来掩盖这一点。也就是说,如果你从1670万个调色板中随机选择1670万个颜色,那么你期望有多少不同的值?我还没有解决它,但10.5m似乎在一个合理的距离PAR。测试,看起来不错(呃!),但2x慢。如果没有时间,这是怎么做到的?(这是我感兴趣的部分)。@菜鸟,如果速度慢了怎么办。每次程序运行时,您只需为生成器设置一次种子。(否则:通过对
time()
getpid()
/
GetCurrentProcessId()
的结果进行哈希运算,我得到了很好的结果。但远没有史蒂夫建议的解决方案那么好。)@JamesKanze,实际上不是一次。但是是的,速度并不是那么重要,只是对正在发生的事情感兴趣,为什么它这么慢,可以让它变快,为什么不。虽然我认为我会坚持使用
cryptgenerandom
,因为它可以通过告诉它创建16个字节而不是4个字节来一次性生成xor128种子,但我认为它可能也会更快。@Rookie:
cryptgenerandom
利用了许多不同的源,包括时间。其中一些只有通过以非常不可移植的方式纠缠设备驱动程序才能供操作系统使用。线性反馈移位寄存器不是像我当前的crc32哈希一样工作吗?是的,crc计算基于lfsr。我建议使用一个额外的lfsr(您可以根据需要配置它(长度、初始种子、聚合名等))作为伪随机数生成器。这可能是您计算crc的输入数据或您需要的任何数据。