gpt4 book ai didi

c++ - 初始化随机生成器的最佳位置

转载 作者:太空宇宙 更新时间:2023-11-03 10:25:27 25 4
gpt4 key购买 nike

在我的程序中,我经常使用随机数生成器。我相信一般规则是您应该将事物定义为靠近它们被“调用”的地方,但这是否也适用于随机数生成器?

例如,在我的代码中,我可以选择:

std::random_device rd;
std::mt19937 rng(rd());
std::uniform_int_distribution<int> uni(-2147483647, 2147483646);

lots of code

for (i = 0; i < 10000; i++)
{
variable x = uni(rng);
}

或者

lots of code

for (i = 0; i < 10000; i++)
{
std::random_device rd;
std::mt19937 rng(rd());
std::uniform_int_distribution<int> uni(-2147483647, 2147483646);
variable x = uni(rng);
}

我会说第一种方法更快,但我有点困惑,因为阅读了许多线程,其中声明它始终将所有内容放置在调用它的地方附近。

最佳答案

在这种情况下,更好在循环外创建 RNG:

std::random_device rd;
std::mt19937 rng(rd());
std::uniform_int_distribution<int> uni(-2147483647, 2147483646);

for (i = 0; i < 10000; i++)
{
variable x = uni(rng);
}

这样做的原因与性能关系不大(尽管它也可能会表现得更好)。原因与正确性有关:

每次循环都在初始化一个新的随机序列,并且只读取一个值。相反,您应该只初始化序列一次,并从中使用许多值。在循环外初始化,在循环内消费。


在性能方面,从 std::random_device 中读取比从诸如 std::mt19937 的 PRNG 中获取下一个值要慢得多。在循环外只执行一次,将节省大量时间。此外,std::mt19937 PRNG 具有较大的状态(624 个整数)。它根据传递给其构造函数的值生成此初始状态。同样,只需执行一次即可提高性能。

当然,在循环外初始化的优势在于它也是标准 RNG 的正确使用模型。

关于c++ - 初始化随机生成器的最佳位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37249907/

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