我正在运行C ++ Primer,我刚刚完成了讨论<random>
实用程序的章节。几个问题问我:
练习17.28:编写一个生成并均匀返回的函数 每次调用时都会分配随机unsigned int。
练习17.29:允许用户提供种子作为可选参数 你在上一个练习中写的功能。
练习17.30:这次再次修改你的功能以达到最低限度 函数应返回的数字的最大值。
这些问题要求我使用讨论过的random_default_engine
和uniform_int_distribution
类。第一个问题很简单:
#include <random>
unsigned randomUns(){
static default_random_engine e;
static uniform_int_distribution<unsigned> u;
return u(e);
}
使用对象的建议static
,以便在调用后不会销毁它们,因此对函数的每次调用都会生成一个新数字而不是从每个序列的开头开始时间。困难在于最后两个问题,我的解决方案最初是:
unsigned randomUns(unsigned minV, unsigned maxV, default_random_engine::result_type seed = 0){
static default_random_engine e(seed);
static uniform_int_distribution<unsigned> u(minV, maxV);
return u(e);
}
除非是在我意识到静态变量只被初始化一次之前。因此,此函数将使用来自u
的调用的参数初始化randomUns
,然后再也不会。我只能在一个范围内使用此功能。 E.g。
cout << randomUns(2,3) << " " << randomUns(5,6);
尽管第二个范围不同,可能会输出2 3
。
seed
存在类似的问题。我该如何处理?对于引擎/种子,我可以像这样重写函数:
static default_random_engine::result prev = 0;
static default_random_engine e(seed);
if(prev != seed){
e.seed(seed)
prev = seed;
}
但当然这不是一个真正随机的功能。
randomUns(1,2,50);
randomUns(1,2,60);
randomUns(1,2,50);
因为我知道第三次调用将产生与第一次相同的输出,因为引擎已重置回同一状态。为了改变发行版的范围,我根本不确定。
每次调用后都不能销毁变量,否则函数将始终输出相同的序列 - 因此它们必须是static
或存在于函数范围之外。另一方面,我需要能够控制范围/种子,因此变量需要在函数内修改。
这可以使用random_default_engine
和uniform_int_distribution
提供的实用程序吗?
答案 0 :(得分:2)
保持引擎<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="defaultEncoding" value="UTF-8"/>
<property name="basenames">...</property>
</bean>
但分布非静态,例如
static
要允许每次调用都更改自定义种子,请同时存储种子,如果不同,则重新创建引擎。
也许像
unsigned randomUns(unsigned minV, unsigned maxV, default_random_engine::result_type seed = 0){
static default_random_engine e(seed);
uniform_int_distribution<unsigned> u(minV, maxV);
return u(e);
}