c++ - 为 STL 随机数生成器编写工厂方法
问题描述
我试图通过一个配置文件提供一个界面,让我的用户为他们正在使用的一些参数选择一个分布。为此,我想使用 STL 随机数生成器算法。
假设我的程序从命令行读取 JSON。对于下面提供的 JSON,程序需要意识到它应该从具有给定均值和标准变化的正态分布中生成一个随机数。(我使用与 STL 库相同的参数名称进行清除。)
{
"dist": "normal_distribution",
"mean": 0.1,
"stddev": 0.5
}
到目前为止,我可以轻松解析 JSON,并使用每个分布param_type
来初始化分布。我使用名称来决定哪个分布来决定param_type
和分布。
我不知道如何很好地实现这一点。我知道我应该为此提供某种工厂方法,传递 JSON,然后输出一个函数或一个类。如果我想返回一个类的实例,比如说unique_ptr
生成器的一个,我需要定义一个抽象类,例如,RandDist
并编写某种适配器来合并我的输入,...。我通常不需要一个课堂上的很多,一个gen()
方法就足够了。
我想知道是否有人对此有想法。或者,如果有人知道可以做到这一点的图书馆。
PS 输入不必是 JSON 对象,任何哈希表本身都可以工作。
解决方案
您描述了一种处理这种情况的非常标准的方法——RandomGenerator
只有一个虚拟方法的抽象类gen()
。
然后,它将具有诸如等的实现NormalDistributionGenerator
,UniformDistributionGenerator
其中构造函数接受适当的分布参数集并将 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
简单明了,并且添加新类型的发行版将很容易,并且只需要在一个地方修改代码 - 工厂方法。
推荐阅读
- ios - 共享扩展帖子照片:无法确定 URL 是否由文件提供商管理
- java - 带索引的数组赋值仅在大括号中有效
- sql - 尝试使用公用表表达式对列标题的别名求和
- visual-studio-code - 如何通过 SSH 使用 VS Code 指定 Python 路径?
- python - 将 float64 项的 Numpy 数组作为二进制插入 PostgreSQL
- wordpress - 是否可以将表格中的数据提供给 wordpress?
- r - 如何消除ggplot方面的死区?
- java - 从与内容具有相同“权重”的二进制图像中去除伪影
- raku - 如何设置类的默认参数化?
- c# - C# WPF 未正确呈现,错过右下界