2013-04-27 25 views
3

最近,我正在写一个基于策略类利用C++ 11的随机数设施的。我希望能够将stdlib随机分布作为策略传递给我的类(特别是作为模板模板参数)。为了达到这个目的,我当然可以创建自己的RandomPolicy类包装器。但我怀疑我在做什么是错的。为什么随机分布不会将引擎作为模板参数?

也就是说,它提出了以下问题:为什么不随机分布取发动机类型作为模板参数?相反,我发现引擎将一个分布作为operator()的参数(而不是作为模板参数)。 在代码中,你可以这样写:

std::default_random_engine engine; 
std::uniform_int_distribution<int> distribution(0, 9); 
int n = distribution(engine); 

在代码中,我本来希望能够写:

当然,分布则因而也必须采取种子为一个参数(对其构造函数)。 当然,我在这里忘记了一些问题/限制。 所以我想知道具体的原因是什么,不把它作为模板参数。

我怀疑这可能是因为发行版不应该处理引擎的构建,但毕竟这不太可能,因为引擎的构造函数除了种子(将被传递给发行版)。

回答

3

我能想到的两个原因:

  1. 你暗示是:发动机可能需要任意参数给它的构造,且分布不知道如何建立它。大多数(所有?)标准引擎只取一颗种子并不意味着没有其他参数。您甚至可以使用任意构造函数参数构建自己的引擎。
  2. 一个单发动机对象可以与许多不同的分布来使用。其实我会说这是使用它的首选方式:只需构建一个引擎和多个发行版。不得不建造几个发动机并将它们全部种下来的选择可能有点麻烦。

它实际上是一种依赖注入的形式

+0

啊,谢谢。我不知道你可以自由地让引擎接受的不仅仅是种子参数。接受答案:)。 – Aleph 2013-04-27 20:23:59

+0

它是否定义了为了与标准分布一起使用而需要放入课堂的内容?我知道它叫'操作符()'来获取值,但有更多的东西需要使用 – Xymostech 2013-04-27 20:31:34

+0

@Xymostech(或者甚至在标准中规定的?):是的,他们被称为_Uniform随机数发生器requirements_ 。基本上它们是:1)typedef'result_type'(无符号整数); 2)'result_type operator()'; 3)'result_type min()'; 4)'result_type max()'。此外:'分钟()'和'MAX()'是常数,'分钟() rodrigo 2013-04-27 21:16:08

相关问题