我应该多久在C里面
我只是想知道在程序开始时是否只能将随机数生成器播种一次.我编写使用随机数的函数.我从来没有在函数中种植rand()生成器,而是在主条目上调用srand().例如.我的程序可能看起来像:
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中最好的做法是什么? 解决方法
拥有随机数生成器(RNG)需要实例化的原因之一是,它可以将其状态保持在内部,这样在多线程应用程序中,当多个线程与进程使用相同的RNG时,不会引入非确定性全球状态假设你有两个线程,每个线程都在问题的独立部分上工作 – 如果状态(种子)对于RNG实例是私有的,那么当您使用已知值种子每个线程的RNG时,您可以确定.另一方面,如果RNG在全局变量中保持状态,则每个线程观察到的随机数的序列取决于它们对RNG的调用的间隔 – 您现在已经介绍了非确定性.
用于在多线程应用程序中分配工作的一种编程模式是thread pool.如果要执行的池中为工作线程排队的工作项需要RNG,并且希望执行从运行到运行确定性,则您希望每个线程在从队列中拉出新的工作项后重新种子RNG >这可以作为工作项的初始化的一部分完成 这是一个涉及这个的SO问题:Deterministic random number generator tied to instance (thread independent) 在单线程应用程序中,不需要重新种子RNG,实际上它是不可取的,因为通过这样做,您可以缩短循环,然后再开始重复.这个例外是@MatthewSanders指出的,密码学 – 在这种情况下,你需要最大熵(最小确定性),因为随机数被用作私钥. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |