void func1() { std::cout << "This is func1 " << std::rand() << std::endl; } void func2() { std::cout << "This is func2 " << std::rand() << std::endl; } int main() { std::srand(std::time(NULL)); func1(); func2(); return 0; }
通过这样做,我可以轻松地从主入口关闭播种.它在调试程序时非常有用 – 每次运行程序而不进行播种时,结果将保持不变.有时,如果由于某些随机数而出现问题,如果要生成不同的一组随机数,则可能会消失,因此我更愿意使用这种简单的机制关闭播种.
然而,我注意到在C 11的新的随机实用程序集中,随机数生成器必须在使用前被实例化. (例如default_random_engine).每次发电机必须分开种子.我想知道,如果需要新的发电机,是否真的鼓励重新装配发电机.我知道我可以创建一个全局随机生成器,并且像以前一样种子,但是我根本不喜欢使用全局变量的想法.否则,如果我创建一个本地的随机数生成器,我有点失去全局关闭种子调试或任何目的的能力.
我很高兴学习C 11中的新功能,但有时只是很混乱.任何人都可以让我知道,如果我有任何错误的新的随机发生器?或者C11中最好的做法是什么?
解决方法
用于在多线程应用程序中分配工作的一种编程模式是thread pool.如果要执行的池中为工作线程排队的工作项需要RNG,并且希望执行从运行到运行确定性,则您希望每个线程在从队列中拉出新的工作项后重新种子RNG
>这可以作为工作项的初始化的一部分完成
>种子可能涉及工作参数的hash function
>如果你对这个编码是如何的小心,你可以有伪随机性
和决定论,不管工作线程的数量
他们将工作从队列中撤出的顺序.
这是一个涉及这个的SO问题:Deterministic random number generator tied to instance (thread independent)
在单线程应用程序中,不需要重新种子RNG,实际上它是不可取的,因为通过这样做,您可以缩短循环,然后再开始重复.这个例外是@MatthewSanders指出的,密码学 – 在这种情况下,你需要最大熵(最小确定性),因为随机数被用作私钥.