c++ - 为 STL 随机数生成器编写工厂方法

标签 c++ design-patterns random c++17

我正在尝试通过配置文件提供一个界面,供我的用户为他们正在使用的某些参数选择分布。为此,我想使用 STL 随机数生成器算法。

假设我的程序从命令行读取 JSON。对于下面提供的 JSON,程序需要意识到它应该从具有给定均值和标准差的正态分布中生成一个随机数。 (我使用与 STL 库相同的参数名称以进行许可。)

{
    "dist": "normal_distribution",
    "mean": 0.1,
    "stddev": 0.5
}

到目前为止,我可以轻松解析 JSON,并使用每个分布的 param_type 来初始化分布。我用名称决定哪个分布来决定param_type和分布。

我不知道如何很好地实现它。我知道我应该为此提供某种工厂方法,传递 JSON,并吐出一个函数或一个类。如果我想返回一个类的实例,比如生成器的 unique_ptr,我需要定义一个抽象类,例如 RandDist 并编写某种适配器合并我的输入,....我通常不需要从类中学到很多东西,只需一个 gen() 方法就足够了。

我想知道是否有人对此有想法。或者,如果有人知道可以执行此操作的图书馆。

附言输入不必是 JSON 对象,任何哈希表本身都可以工作。

最佳答案

您描述了一种处理这种情况的非常标准的方法 - 抽象 RandomGenerator 类只有一个虚拟方法 gen()

然后,它将有像 NormalDistributionGeneratorUniformDistributionGenerator 等实现,构造函数接受适当的分布参数集并将 STL 东西初始化为成员。 这些具体类只会在生成器创建例程中直接使用,在其他地方作为抽象RandomGenerator使用。

所以创建程序看起来像这样

std::unique_ptr<RandomGenerator> CreateRandomGenerator(const Info& info) {
    switch (info.type) {
    case Type::Normal:
        return std::make_unique<NormalDistributionGenerator>(info.mean(), info.stddev());
    case Type::Uniform:
        return std::make_unique<UniformDistributionGenerator>(info.a(), info.b());
    // ...
    }
}

Info - 是一个包含分布信息的类(一些 JSON 包装器,map/hash_table - 任何最适合你的情况)。

所以你肯定需要编写一些样板代码来让它工作,但它会使你的RandomGenerator的用法简单明了,并添加新的类型分发将非常简单,只需要在一个地方修改代码 - 工厂方法。

关于c++ - 为 STL 随机数生成器编写工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56359951/

相关文章:

oop - 使用面向对象的分析和设计对电梯进行建模

java - 随机落体及碰撞检测方法

c++ - 我可以动态更改在 Visual Studio 中使用 C++ 创建的对话框窗口的字体大小吗?

c++ - 生成所有可能调用堆栈的树

php - 我这里需要依赖注入(inject)容器吗

java - 需要设计模式

c++ - 制作 : variable fails to assign from shell call

c++ - 为什么 map 在 C++ 中创建 NULL?

在 Qualtrics 中随机化 block 内的页面?

c++ - (C++) 随机数相等,但程序说它们不相等