gpt4 book ai didi

c++ - 实例化 C++11 随机设施的正确方法是什么

转载 作者:可可西里 更新时间:2023-11-01 18:39:37 29 4
gpt4 key购买 nike

在查看了有关使用 C++ 中新“随机”工具的各种示例之后,我对最佳实践感到有些困惑 - 特别是与各种实例的生命周期相关。

例如,在某些示例中,“random_device”的使用要么像函数一样在局部范围内是静态的,要么是静态全局变量,或者只是一个简单的局部变量。

--- TU ---

static std::random_device global_source;


void foo()
{
static std::random_device local_static_source;
static std::mt19937 gen(local_static_source());
std::uniform_int_distribution<> dist(0,10);
...
dist(gen);
...
}

void boo()
{
std::mt19937 gen(global_source());
std::uniform_int_distribution<> dist(0,10);
...
dist(gen);
...
}

void roo()
{
std::random_device local_source;
std::mt19937 gen(local_source());
std::uniform_int_distribution<> dist(0,10);
...
dist(gen);
...
}

int main()
{
static std::mt19937 gen(global_source());
std::uniform_int_distribution<> dist(0,10);
...
dist(gen);
...
return 0;
}

--- TU ---

Q1:如果“foo”或“boo”可以被多个线程访问,生成器和源可以是静态的吗? - 是否有类似 shared_ptr 中的线程安全保证?

Q2:标准中是否有讨论与实例化相关的假设和问题的措辞?

最佳答案

一些背景:允许随机数生成器的多个实例的原因主要是线程安全(不增加线程同步的随机数生成器实现负担)和可重复性(允许使用相同种子重复一系列数字)。

  • 前者是不言自明的 - 在性能关键代码中使用 RNG 的有效案例。由于可以使用多个实例,因此不需要昂贵的互斥锁,并且可以在多个 CPU 内核上并行生成随机数。

  • 后者在随机生成数据集时通常很有用。作为一个常见的例子,视频游戏可能会通过从相同的 RNG(甚至可能在不同的联网 PC 上)驱动与创建游戏世界相关的所有决策来重建相同的(随机)游戏世界。

因此,C++ RNG 的最佳作用域取决于您编写的内容:

如果您正在编写一个库,可能会在上述场景的上下文中使用,那么让调用者将 RNG 提供给各个方法或类可能是个好主意:

// Can be used on multiple CPU cores in parallel or with seed values
template <typename TRandomNumberEngine>
Point2 GetRandomPointInRectangle(
const Rectangle2 &rect, TRandomNumberEngine &random
) {
std::uniform_real_distribution<float> horizontal(rect.Min.X, rect.Max.X);
float x = horizontal(random);

std::uniform_real_distribution<float> vertical(rect.Min.Y, rect.Max.Y);
float y = vertical(random);

return Point2(x, y);
}

如果您正在编写应用程序 或使用 RNG 辅助角色(例如几何拟合算法)的库,即。您只对不可重复的随机数感兴趣,随机数生成器的最佳范围是不会在模块之间引入不需要的耦合的最大可能范围。

这可能是一个简单的私有(private)对象变量,在任何需要随机数的类中,或者甚至是 thread_local 单例提供您选择的 RNG,如果它有很多短暂的消费者证明这种复杂性是合理的。


分布(如 std::uniform_real_distribution)可以像您想要的那样短暂。它们是普通仿函数,其中构造函数没有参数或仅存储仿函数执行时的参数。

关于c++ - 实例化 C++11 随机设施的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22085270/

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