我应该多久在C里面

前端之家收集整理的这篇文章主要介绍了我应该多久在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

>这可以作为工作项的初始化的一部分完成
>种子可能涉及工作参数的hash function
>如果你对这个编码是如何的小心,你可以有伪随机
和决定论,不管工作线程的数量
他们将工作从队列中撤出的顺序.

这是一个涉及这个的SO问题:Deterministic random number generator tied to instance (thread independent)

在单线程应用程序中,不需要重新种子RNG,实际上它是不可取的,因为通过这样做,您可以缩短循环,然后再开始重复.这个例外是@MatthewSanders指出的,密码学 – 在这种情况下,你需要最大熵(最小确定性),因为随机数被用作私钥.

猜你在找的C&C++相关文章