通常我使用类似的东西:
srand(time(0));
Run Code Online (Sandbox Code Playgroud)
获得随每个程序调用而变化的伪随机性.但是,我现在处于一种情况,我有一批程序将同时启动,因为time每秒只更改一次,大部分时间我的所有程序都以相同的种子开始.
当我想要一堆程序一次启动并且所有程序都获得不同的种子时,什么是更好的策略来播种我的RNG?
用于srand(time(0) ^ getpid())通过特定于流程的值来置换种子.这将确保在同一秒内开始的流程的不同种子.注意不要将此用于任何"重要"的事情,例如,加密或涉及真钱.
使用"exclusive-or"或XOR运算符'^'来完成排列.因为我们知道同时运行的两个进程必须具有不同的进程ID,通过将时间(0)的响应与当前PID进行编码,我们可以得到一些保证,即两个不同的进程不会具有完全相同的种子.
请注意,这是一个非常弱的保证,因为我们只是在几个位上.如果时间仅增加一秒并且进程id只增加一个,那么在某些情况下你最终会得到相同的种子.
如果您需要真正不同的随机数种子,那么您希望从/ dev/random读取4个字节,然后将其用作整数来为您的RNG播种.
再次,请不要将此随机数序列用于任何"重要".重要的是,我的意思不仅仅是简单的蒙特卡罗模拟或石头剪刀游戏.