C++ 对随机种子使用srand时复制输出

C++ 对随机种子使用srand时复制输出,c++,random,srand,C++,Random,Srand,我使用srand(time(NULL));生成一个随机种子 问题是,我正在向LINUX集群提交30多个相同的作业。如果我一次提交一个,一切都很好,但我当然更喜欢使用批处理作业一次提交全部30个。更容易更快。问题是,然后几批作业似乎都完全同时访问,我得到了重复的结果!有人能提出一个简单的解决方案吗 查看C++11中的中的新功能。特别是std::random_设备。否则,一个俗气的解决方案是将pid添加到时间(NULL)。考虑从/dev/random或/dev/uradom读取。它们比rand()(

我使用srand(time(NULL));生成一个随机种子


问题是,我正在向LINUX集群提交30多个相同的作业。如果我一次提交一个,一切都很好,但我当然更喜欢使用批处理作业一次提交全部30个。更容易更快。问题是,然后几批作业似乎都完全同时访问,我得到了重复的结果!有人能提出一个简单的解决方案吗

查看C++11中的
中的新功能。特别是std::random_设备。否则,一个俗气的解决方案是将pid添加到时间(NULL)。

考虑从
/dev/random
/dev/uradom
读取。它们比
rand()
(通常只是一个简单的线性同余生成器)具有更高质量的随机性,
/dev/random
阻塞,直到建立了足够的熵。

它们可能得到相同的时间戳。是否有一些环境变量可用于添加到初始种子?比如进程ID之类的?一块好表:这个问题似乎离题了,因为。@Griwes为什么这样会离题呢?这是一个编程问题,不是吗?使用它们的生成器可能会复制或种子…使用任意一个随机设备种子
rand()
,没有任何意义
rand()
设计用于快速生成看似随机的数字。用一个随机装置植入它只会限制熵。这将避免他在批处理作业中重复生成器状态的问题。我不确定用
/dev/{u}/random
播种
rand()
如何限制熵。你能解释一下吗?当然,但这只是增加了另一层复杂性。既然你已经有了很好的随机数源,为什么还要调用
rand()
?用这两种设备中的任何一种来播种
rand()
,都会限制熵,因为
rand()
的输出很容易预测,即使输入很好。这就是它实现的本质。更正:我可能错了。我不知道
rand()
在Linux上的实现细节。在其他Unix(y)系统上,
rand()
通常只是一个简单的LCG或Twister,其输出在一定次数的迭代后变得可预测。如果Linux上不是这样,那么使用随机设备的输出播种
rand()
,可能不会显著降低熵。