如何在C++ 11 RNG的初始状态的本地和全局设置之间切换?

Pet*_*teL 5 c++ prng c++11

在下面给出的代码中,我想实现一个标志(或同样简单的东西),它具有与注释本地设置和使用全局设置一些相同的效果(在此示例中产生两个不同的数字),并使用其他时间的本地设置(在此示例中产生两个相同的数字).

我已经尝试了明显的"if"和"switch"结构而没有成功.

#include <iostream>
#include <random> 

void print();

std::seed_seq seed{1, 2, 3, 4, 5}; 
std::mt19937 rng(seed); // *global* initial state
std::uniform_real_distribution<> rand01(0, 1); 

int main()
{
    print();
    print();

    return 0; 
}

void print()
{
    std::mt19937 rng(seed); // *local* initial state
    std::cout << rand01(rng) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 5

使用三元参考:

std::mt19937& ref = flag ? rng : local;
Run Code Online (Sandbox Code Playgroud)

在这里,flag是测试的条件,rng是"全局"随机对象,并且local是更本地化的.

绑定对三元结果的引用在语法上是有效的:您不能使用if语句或类似的语句来执行它,因为它们不是正确类型的表达式.

从那时起,使用ref.只要rnglocal保持在范围内,这将是有效的.