如何在 C++11 RNG 初始状态的本地和全局设置之间切换?
How do I switch between local and global settings for the initial state of a C++11 RNG?
在下面给出的代码中,我想实现一个标志(或同样简单的东西),它与注释掉 local 设置和使用 global 有时设置(在这个例子中产生两个不同的数字),而在其他时候使用本地设置(在这个例子中产生两个相同的数字)。
我已经尝试了明显的 "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;
}
使用三进制和引用:
std::mt19937& ref = flag ? rng : local;
这里,flag
是要测试的条件,rng
是"global"随机对象,local
是更本地化的对象。
绑定对三元结果的引用在语法上是有效的:您不能使用 if
语句或类似的语句来实现,因为它们不是 表达式 类型正确。
从那时起,使用 ref
。只要 rng
和 local
仍在范围内,这就有效。
在下面给出的代码中,我想实现一个标志(或同样简单的东西),它与注释掉 local 设置和使用 global 有时设置(在这个例子中产生两个不同的数字),而在其他时候使用本地设置(在这个例子中产生两个相同的数字)。
我已经尝试了明显的 "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;
}
使用三进制和引用:
std::mt19937& ref = flag ? rng : local;
这里,flag
是要测试的条件,rng
是"global"随机对象,local
是更本地化的对象。
绑定对三元结果的引用在语法上是有效的:您不能使用 if
语句或类似的语句来实现,因为它们不是 表达式 类型正确。
从那时起,使用 ref
。只要 rng
和 local
仍在范围内,这就有效。