假设程序启动时我有一个静态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)
或者,还有更好的方法?
每次都可以实例化一个新的 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)
所以现在您不必担心您的发行版是否正在缓存结果。
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |