通常我会使用类似以下代码:
srand(time(0));
为了获得每次程序调用时都会改变的伪随机性。然而,我现在面临一个批量启动所有程序的情况,由于“时间”仅在每秒钟改变一次,因此大多数时候,所有程序都使用相同的种子开始运行。
当我想让一堆程序同时启动并获得不同的种子时,有更好的种子生成策略吗?
通常我会使用类似以下代码:
srand(time(0));
srand(time(0) ^ getpid())
来通过进程特定值对种子进行排列。这将确保在同一秒内启动的进程具有不同的种子。请注意,不要在任何“重要”的事情中使用它,例如涉及密码学或真实货币。time(0) ^ getpid()
的合理且简单的解决方案加1。然而,它确实存在一些问题,因为 gid
有一定的可预测性,当然 time(0)
也是如此。也许如果每个程序都有自己在代码中固定的随机值:time(0) ^ getpid() ^ my_program_mask
。我想,归根结底,每个程序都需要调用一个真正随机的源。 - chux - Reinstate Monicatime(0)
与其他特定于程序的值结合使用。例如,将其与程序名称的良好哈希值(argv[0]
通常足够)异或,甚至只是(最好是哈希值)进程ID的异或(如果它们在同一主机上启动,否则进一步与主机名或IP的哈希值异或)。您甚至可以使用UUID的哈希值。getpid()
以及一些亚秒时间(也许是整秒时间)。也许制作一个值的MD5哈希,并使用它?使用getpid()
保证您使用的数据部分对于每个进程都是唯一的,但本身并不给您很多随机性。当然,使用rand()
几乎不能保证是一个好的随机数生成器。您肯定不能将其用于加密。