每次都可以实例化一个新的 random_distribution 吗?

Bra*_*don 2 c++ c++17

假设程序启动时我有一个静态std::default_random_engine种子std::random_device

现在我想使用该随机引擎生成随机数,所以我这样做:

std::uniform_int_distribution<std::default_random_engine::result_type> dist{min, max};

创建一个分布。这种分布有一个固定的范围。我无法改变范围说[min2, max2]..所以我创建了一个新的发行版。

可以继续创建这些对象吗?例如:

int generate_random(int min, int max)
{
    //creates a new distribution every time..
    std::uniform_int_distribution<std::default_random_engine::result_type> dist(min, max);
    return dist(engine);
};
Run Code Online (Sandbox Code Playgroud)

或者,还有更好的方法?

How*_*ant 5

每次都可以实例化一个新的 random_distribution 吗?

一般来说,没有。然而uniform_int_distribution,是的。

交易是这样的:一些分布维护更多的状态,而不仅仅是你构造它的参数。并且要知道哪些发行版会这样做,哪些不会。

的实现uniform_int_distribution将简单地存储您构建它的范围,然后在每次使用引擎的分布调用中使用该范围。

然而, anormal_distribution 可能存储更多的状态,而不仅仅是构造它的内容。当您使用引擎调用它时,它可能一次计算多个结果(出于性能原因),给您一个,然后缓存另一个。当您第二次调用它时,它只是将缓存的结果交给您。例如,Box-Muller技术为每个“调用”生成两个结果。

所以这真的取决于分布,以及该分布的实现。

然而有一个出...

每个分布都有一个嵌套的param_type, 和一个辅助调用运算符,它采用一个。您可以使用它来有效地为您的分布提供新的构造参数,而不会冒丢弃分布中的状态的风险。例如:

int generate_random(int min, int max)
{
    using Dist = std::uniform_int_distribution<std::default_random_engine::result_type>;
    static Dist dist(min, max);
    return dist(engine, Dist::param_type(min, max));
};
Run Code Online (Sandbox Code Playgroud)

所以现在您不必担心您的发行版是否正在缓存结果。