【问题标题】:Seeding random number generator for a batch of programs为一批程序播种随机数生成器
【发布时间】:2014-06-02 12:59:20
【问题描述】:

所以通常我使用类似的东西:

srand(time(0));

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

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

【问题讨论】:

  • 使用更细粒度的计时器(即系统纳秒计数器)并将其与进程 ID 混合。对于安全应用程序或蒙特卡洛模拟仍然不够好。
  • 使用 rdtsc stackoverflow.com/a/7617612/995714,它是处理器启动后的伪周期数。如果您需要更多保证,请使用 PID 异或

标签: c random


【解决方案1】:

使用srand(time(0) ^ getpid()) 按特定于流程的值置换您的种子。这将确保在同一秒内启动的进程有不同的种子。请注意不要将其用于任何“重要”的事情,例如涉及密码学或真钱。

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

请注意,这是一个非常弱的保证,因为我们只是在玩弄一些位。如果时间恰好增加一秒,而进程 ID 恰好增加一,那么在某些情况下,您最终会得到相同的种子。

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

同样,请不要将此随机数序列用于任何“重要”的事情。重要的是,我指的不仅仅是简单的蒙特卡罗模拟或剪刀石头布游戏。

【讨论】:

  • 爱它。也许更深入地了解 XOR 如何创造新的独特价值。 +1
  • 如果您手边有一个合适的库,您可能希望使用像 SHA-1 这样的安全散列函数来使您的 RNG 种子脱离当前时间和进程 ID 号。如果RNG真的很好,我猜这应该没关系,但我有点担心各种PID值只会相差几位。安全散列函数确实起到了散列的作用,即使输入的一个位差异也会导致输出的巨大差异。对于 RNG 系列的每个值,这可能太耗时,但对于种子来说应该没问题。
  • 即使你使用 SHA-1 来生成种子,你也没有比对 time() 和 getpid() 的基本调用更多的熵,所以做任何更复杂的事情都是浪费精力。如果 OP 打算使用 srand/random,那么他们能做的最好的事情就是从 /dev/random 中提取种子。
  • +1 以获得time(0) ^ getpid()) 的合理且简单的解决方案。尽管gid 对它有一定的可预测性,当然time(0) 也有一些 问题。也许如果每个程序都有自己的随机值,并在代码中构思和固定:time(0) ^ getpid() ^ my_program_mask。我想,归根结底,每个程序都需要调用一个真正随机的源。
  • 这很棒。对于我的使用,我实际上只需要 getpid() 并且可以完全取消随机数(我只需要来回翻转一点),但如果将来有人发现这个答案,这将更加完整。
【解决方案2】:

也许您需要使用getpid() 以及一些亚秒时间(也可能是整个第二时间)。也许对值进行 MD5 哈希,然后使用它?使用getpid() 可以保证您使用的部分数据对于每个进程都是唯一的,但它本身并不会给您的种子带来很大的随机性。当然,使用rand() 并不能保证是一个好的随机数生成器。你当然不能用它来加密。

【讨论】:

    【解决方案3】:

    可以将time(0)与其他特定于某些项目特定的值相结合。例如,XOR它具有程序名称的体面散列(argv[0]通常足够),甚至只是(最好是一个散列)进程ID(如果它们在同一主机上启动,否则XOR进一步主机名或 IP 的哈希值)。您甚至可以使用UUID的哈希。

    注意:只需与进程ID的xoring非常弱 - 如果在进程开始时第二次刻录,则可以很容易地在时间值中翻转的位与两个过程ID之间不同的比特相匹配,离开产生的种子相同。也就是说,投入了一定的努力,与您有多少次关心的努力相称....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-03
      • 2015-03-14
      • 1970-01-01
      • 2019-07-16
      • 2016-07-22
      • 1970-01-01
      • 2013-09-24
      • 2017-04-06
      相关资源
      最近更新 更多