加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

我应该多久在C里面

发布时间:2020-12-16 05:51:14 所属栏目:百科 来源:网络整理
导读:我只是想知道在程序开始时是否只能将随机数生成器播种一次.我编写使用随机数的函数.我从来没有在函数中种植rand()生成器,而是在主条目上调用srand().例如.我的程序可能看起来像: void func1(){ std::cout "This is func1 " std::rand() std::endl;}void fun
我只是想知道在程序开始时是否只能将随机数生成器播种一次.我编写使用随机数的函数.我从来没有在函数中种植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指出的,密码学 – 在这种情况下,你需要最大熵(最小确定性),因为随机数被用作私钥.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读