c-一批程序的种子随机数生成器



所以通常我会使用这样的东西:

srand(time(0));

获得随每次程序调用而变化的伪随机性。然而,我现在的情况是,我有一批程序将同时启动,并且由于time每秒只更改一次,所以大多数时候我的所有程序都以相同的种子启动。

当我想要一堆程序同时启动并获得不同的种子时,有什么更好的策略来播种我的RNG?

使用srand(time(0) ^ getpid())按进程特定值排列种子。这将确保在同一秒内启动的进程具有不同的种子。注意不要将其用于任何"重要"的事情,例如涉及加密或真实货币。

置换是使用"异或"或XOR运算符"^"完成的。因为我们知道同时运行的两个进程必须具有不同的进程ID,所以通过将来自时间(0)的响应与当前PID异或,我们可以确保两个不同的进程不会具有完全相同的种子。

请注意,这是一个非常薄弱的保证,因为我们只是在处理一些细节。如果时间正好增加一秒钟,进程id正好增加一秒,那么在某些情况下,您最终会得到相同的种子。

如果您需要真正不同的随机数种子,那么您需要从/dev/random读取4个字节,然后将其用作整数来为RNG种子。

再说一遍,请不要把这个随机数序列用于任何"重要"的事情。重要的是,我指的不仅仅是简单的蒙特卡罗模拟或石头剪刀游戏。

您可以将time(0)与其他特定于程序的值组合。例如,将其与程序名的适当散列进行异或(argv[0]通常就足够了),甚至只与进程id(最好是进程id的散列)(如果它们在同一主机上启动,否则将与主机名或IP的散列进行进一步异或)。您甚至可以使用UUID的散列。

注意:仅使用进程id执行异或操作是非常弱的——如果在进程启动时第二个周期结束,则很容易出现时间值中翻转的位与两个进程id之间不同的位匹配,从而使生成的种子完全相同。也就是说,付出与你有理由关心的程度相称的努力。。。。

也许您需要使用getpid()以及一些亚秒时间(也许还有整个秒时间)。也许可以对这些值进行MD5散列,然后使用它?使用getpid()可以保证您使用的部分数据对每个进程都是唯一的,但它本身不会给您的种子带来太多随机性。当然,使用rand()很难保证是一个好的随机数生成器。你当然不能把它用于密码学。

相关内容

最新更新