【发布时间】:2015-12-30 16:03:23
【问题描述】:
我正在尝试创建一个用随机数填充列表的函数,并根据列表项的类型生成整数或浮点数。到目前为止,我已经提出了以下代码,并且它可以工作:
template <typename T>
void generateRandom(list<T>& numberList){
default_random_engine randomGenerator(random_device{}());
if( typeid(T) == typeid(int) ){
uniform_int_distribution<T> distribution(1000, 2000);
auto myGenerator = bind(distribution, randomGenerator);
generate(numberList.begin(), numberList.end(), myGenerator);
}
else if( typeid(T) == typeid(double) ){
uniform_real_distribution<T> distribution(1000.0, 2000.0);
auto myGenerator = bind(distribution, randomGenerator);
generate(numberList.begin(), numberList.end(), myGenerator);
}
else{
return;
}
}
但是,我对这个解决方案并不满意。感觉应该有某种方法可以打破除该 IF 语句的实际分布之外的所有内容。比如:
template <typename T>
void generateRandom(list<T>& numberList){
default_random_engine randomGenerator(random_device{}());
X distribution;
if( typeid(T) == typeid(int) )
distribution = uniform_int_distribution<T>(1000, 2000);
else if( typeid(T) == typeid(double) )
distribution = uniform_real_distribution<T>(1000.0, 2000.0);
else
return;
auto myGenerator = bind(distribution, randomGenerator);
generate(numberList.begin(), numberList.end(), myGenerator);
}
(X 是此处缺少的占位符)
但是由于uniform_int_distribution 和uniform_real_distribution 没有共同的基类,那怎么可能呢?我尝试过使用函数指针和仿函数,但我似乎从来没有超过那个 IF 语句,这很烦人。这可以用更优雅的方式解决吗?
注意:这是学校作业的一部分,我们必须使用generate() 和<random> 函数和模板来生成随机数。我认为我的原始解决方案是可以接受的,我只是不喜欢 IF 语句中那些重复的代码行的外观...... :)
【问题讨论】:
标签: c++ random function-pointers distribution functor