为一批程序播种随机数发生器

pjr*_*die 2 c random

通常我使用类似的东西:

srand(time(0));
Run Code Online (Sandbox Code Playgroud)

获得随每个程序调用而变化的伪随机性.但是,我现在处于一种情况,我有一批程序将同时启动,因为time每秒只更改一次,大部分时间我的所有程序都以相同的种子开始.

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

cas*_*key 6

用于srand(time(0) ^ getpid())通过特定于流程的值来置换种子.这将确保在同一秒内开始的流程的不同种子.注意不要将此用于任何"重要"的事情,例如,加密或涉及真钱.

使用"exclusive-or"或XOR运算符'^'来完成排列.因为我们知道同时运行的两个进程必须具有不同的进程ID,通过将时间(0)的响应与当前PID进行编码,我们可以得到一些保证,即两个不同的进程不会具有完全相同的种子.

请注意,这是一个非常弱的保证,因为我们只是在几个位上.如果时间仅增加一秒并且进程id只增加一个,那么在某些情况下你最终会得到相同的种子.

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

再次,请不要将此随机数序列用于任何"重要".重要的是,我的意思不仅仅是简单的蒙特卡罗模拟或石头剪刀游戏.