通常我会使用类似的东西:
srand(time(0));
获得随每次程序调用而变化的伪随机性。但是,我现在处于这样一种情况,即我有一批程序将同时启动,因为time
每秒都会更改,大部分时间我的所有程序都以同样的种子。
当我想要一堆程序一次启动并且所有程序都获得不同的种子时,有什么更好的策略来播种我的RNG?
答案 0 :(得分:6)
使用srand(time(0) ^ getpid())
按特定于流程的值置换种子。这将确保在同一秒内开始的流程的不同种子。注意不要将此用于任何“重要”的事情,例如,加密或涉及真钱。
使用“exclusive-or”或XOR运算符'^'完成排列。因为我们知道同时运行的两个进程必须具有不同的进程ID,通过将时间(0)的响应与当前PID进行编码,我们可以得到一些保证,即两个不同的进程不会具有完全相同的种子
请注意,这是一个非常弱的保证,因为我们只是在几位。如果时间只增加一秒钟,并且进程id只增加一个,那么在某些情况下你最终会得到相同的种子。
如果你需要真正不同的随机数种子,那么你想从/ dev / random读取4个字节,然后用它作为整数来为你的RNG播种。
同样,请不要将此随机数序列用于“重要”的任何内容。重要的是,我的意思不仅仅是简单的蒙特卡罗模拟或石头剪刀游戏。
答案 1 :(得分:0)
您可以将time(0)
与其他某些特定于程序的值结合使用。例如,XOR它具有程序名称的合适散列(argv[0]
通常就足够了),或者甚至只是(最好是散列)进程id(如果它们在同一主机上启动,否则XOR进一步使用主机名或IP的哈希值。你甚至可以使用UUID的哈希值。
注意:只使用进程ID进行xoring非常弱 - 如果第二个进程在进程启动时结束,则很可能是时间值中翻转的位与两个进程ID之间的位不一致,留下生成的种子相同。也就是说,付出了相当于你有多少理由照顾的努力......
答案 2 :(得分:0)
也许您需要使用getpid()
以及一些亚秒时间(也许也可能是第二次)。也许制作一个MD5哈希的值,并使用它?使用getpid()
可以保证您使用的部分数据对每个流程都是唯一的,但它本身并不会给您的种子带来很多随机性。当然,使用rand()
几乎不能保证是一个好的随机数生成器。你当然不能用它来加密。