[英]C++ STL random number generation returning the same number
我还没有找到类似的问题,因此,如果有人问过我,我深表歉意。 无论如何,这是我的功能:
#ifndef OPTIMALIZATION_HPP
#define OPTIMALIZATION_HPP
#include<utility>
#include<random>
#include<experimental/random>
#include<functional>
#include<experimental/functional>
#include<experimental/tuple>
#include<algorithm>
#include<type_traits>
#include<iostream>
namespace numerics{
template<
std::size_t population_size, std::size_t generations,
typename Func,
typename Compare,
typename Generator=std::default_random_engine,
template<typename>
typename RealDistribution=std::uniform_real_distribution,
template<typename>
typename IntegerDistribution=std::uniform_int_distribution,
typename ...Ts
>
auto optimize(
const Func& function, const Compare& comp,
const std::pair<Ts,Ts>&... ranges
){
constexpr std::size_t range_argument_count=sizeof...(ranges);
static_assert(range_argument_count>2,
"Function needs at least two range arguments"
);
//RANDOM NUMBER GENERATORS LAMPDA FUNCTIONS
auto real_random_generator=[&](const std::pair<auto,auto> range){
return std::bind(
RealDistribution<decltype(range.first)>(range.first,range.second),
Generator()
);
};
auto integer_random_generator=[&](const std::pair<auto,auto>& range){
return std::bind(
IntegerDistribution<decltype(range.first)>(range.first,range.second),
Generator()
);
};
//MAKING TUPLE OF GENERATORS FOR SPECIFIC RANGES ARGUMENTS
auto generator_objects=std::make_tuple(
integer_random_generator,
real_random_generator
);
auto generators=std::make_tuple(
std::get<std::is_floating_point<decltype(ranges.first)>::value> //UPDATE FOR C++17
(generator_objects)(ranges)...
);
//RANDOMIZES NUMBERS FINE!
std::cout << std::get<0>(generators)() << std::endl;
std::cout << std::get<0>(generators)() << std::endl;
//SINGLE RANDOM INDIVIDUAL GENERATOR
auto generate_random_individual=[&](const auto& gen){
auto genotype=std::experimental::apply(
[&](auto... x){
return std::make_tuple(x()...);
},
gen
);
return std::make_pair(
std::experimental::apply(function,genotype),
genotype
);
};
//RETURN THE SAME NUMBER!
auto foo=generate_random_individual(generators);
auto foo2=generate_random_individual(generators);
auto foo3=generate_random_individual(generators);
auto foo4=generate_random_individual(generators);
std::cout << std::get<0>(foo.second) << std::endl;
std::cout << std::get<0>(foo2.second) << std::endl;
std::cout << std::get<0>(foo3.second) << std::endl;
std::cout << std::get<0>(foo4.second) << std::endl;
return 1.;
}}
#endif
最有趣的部分是我通过其中一个生成器的函数调用进行随机化,并且运行良好(行:// RANDOMIZES NUMBERS FINE!)当我在函数generate_random_individual(使用少数具有特定范围的生成器对象)中通过相同的函数进行操作时调用相同的对象集(因此,我不会制造新的生成器),它在最后一个cout中返回相同的数字。
如果有人需要,我可以提供测试用例,但不确定是否应包括这些用例。
编辑:我以这个为例,如果您想知道错误的确切位置,请参阅我的回答,感谢您的帮助。
每次要使用随机数时,您都在创建新的生成器。 我不知道这些生成器的种子是如何生成的,但是很显然,对于您创建的每个生成器实例,都使用相同的种子。 相反,您应该做的是创建所有发行版使用的单个生成器。
您可能需要查看boost随机类提供的内容,并在那里检查一些样本。
问题已解决-传递函数之一时,我忘了添加&,即在这里:
auto genotype=std::experimental::apply(
[&](auto&... x){ //THIS LINE!
return std::make_tuple(x()...);
},
gen
);
结果,正如您大多数人所说,它正在复制生成器,谢谢您的投入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.