gpt4 book ai didi

c++ - 我应该多久重新播种一次 C++?

转载 作者:可可西里 更新时间:2023-11-01 15:38:15 25 4
gpt4 key购买 nike

我只是想知道在程序开始时只为随机数生成器提供一次种子是否足够。我编写使用随机数的函数。我从不在函数中播种 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 中的新功能,但有时会感到非常困惑。如果我对新的随机生成器有任何问题,谁能告诉我?或者 C++11 中的最佳实践是什么?

最佳答案

这肯定取决于您正在开发的系统的总体目标,但一般来说,您只需要在系统初始化时为任何需要随机数生成器 (RNG) 的系统播种一次。

在游戏开发中,每个系统(AI、程序内容生成器、粒子等)都有一个单独的 RNG 以隔离该系统以进行调试和维护是很常见的。

如果您存储种子,您还可以用非常少的数据重放逻辑(只需要来自每一帧的增量输入)。这不仅可以让您更轻松地调试应用程序,还可以让您为用户支持录制和重放功能。显然,如果您要创建重播模式,则需要在每次重播 session 之前为系统提供每个系统的记录种子。

还有其他系统,例如密码学,您可能希望在其中定期建立新种子。您可能希望随着时间的推移使种子过期,或者需要在每次与客户端应用程序握手时生成一个新种子。但是,您可能希望使用密码学库,因为它们可能比您自己推出的东西更强大。

关于c++ - 我应该多久重新播种一次 C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15183010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com