Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;返回相同数字的STL随机数生成_C++_C++11_Random_Stl_C++14 - Fatal编程技术网

C++ C++;返回相同数字的STL随机数生成

C++ C++;返回相同数字的STL随机数生成,c++,c++11,random,stl,c++14,C++,C++11,Random,Stl,C++14,我还没有发现类似的问题,所以如果已经有人问过,我道歉。无论如何,我的功能如下: #ifndef OPTIMALIZATION_HPP #define OPTIMALIZATION_HPP #include<utility> #include<random> #include<experimental/random> #include<functional> #include<experimental/functional> #incl

我还没有发现类似的问题,所以如果已经有人问过,我道歉。无论如何,我的功能如下:

#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
\ifndef优化\u水电站
#定义水电站优化
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
名称空间数字{
模板<
std::size\u t population\u size,std::size\u t generations,
typename Func,
类型名比较,
typename生成器=标准::默认\u随机\u引擎,
模板
typename RealDistribution=std::统一实分布,
模板
typename IntegerDistribution=std::统一整数分布,
typename…Ts
>
自动优化(
常量函数和函数,常量比较和比较,
常数std::pair&…ranges
){
constepr std::size\u t range\u argument\u count=sizeof…(范围);
静态断言(范围参数计数>2,
“函数至少需要两个范围参数”
);
//LAMPDA函数的随机数发生器
自动实数随机发生器=[&](常数标准::对范围){
返回std::bind(
重新分配(范围第一,范围第二),
发电机()
);
};
自动整数\u随机\u生成器=[&](常量标准::对和范围){
返回std::bind(
整数分布(range.first,range.second),
发电机()
);
};
//为特定范围参数生成生成器元组
自动生成器\u objects=std::make\u元组(
整数随机发生器,
实随机发生器
);
自动生成器=标准::生成元组(
std::get//C++17的更新
(生成器对象)(范围)。。。
);
//随机数很好!

std::cout每次你想使用随机数时,你都在创建新的生成器。我不知道这些生成器的种子是如何生成的,但很明显,你创建的每个生成器实例都使用相同的种子。你应该做的是创建一个所有发行版都使用的生成器


您可能想看看boost random类提供了什么,并检查其中的一些示例。

每次您想使用随机数时,都会创建新的生成器。我不知道这些生成器的种子是如何生成的,但很明显,您创建的每个生成器实例都使用相同的种子。您应该做什么ing正在创建所有发行版都使用的单一生成器


您可能想看看boost random类提供了什么,并检查其中的一些示例。

问题已解决-我在传入一个函数时忘了添加&即:

auto genotype=std::experimental::apply(
                    [&](auto&... x){ //THIS LINE!
                        return std::make_tuple(x()...);
                    },
                    gen
            );

结果,正如你们大多数人所说,它复制了生成器,谢谢你们的输入。

问题解决了-我在传递我的一个函数时忘了添加&即:

auto genotype=std::experimental::apply(
                    [&](auto&... x){ //THIS LINE!
                        return std::make_tuple(x()...);
                    },
                    gen
            );

结果,正如你们大多数人所说,它复制了生成器,谢谢你们的输入。

TL;DR;Seed只有一次。我看不出你们在哪里为生成器设置了种子(我可能错过了一些东西)-如果不进行种子设定,您将始终获得相同的序列。@JesperJuhl我必须对其进行种子设定吗?我使用随机库,我希望对generate_random_individual的每个调用都有不同的输出。似乎此lampda函数使用相同的生成器,因为它通过lampda调用获取这些生成器,因此它应该返回不同的随机值太长了,读不下去了,你需要去创建最小的例子。是的,你必须把它们种子化,或者每个程序的调用都有相同的值。你需要重用生成器,不要重新创建它们,因为它会再次重置随机序列。TL;DR;种子只有一次。我不知道你在哪里生成你的生成器。(我可能错过了什么)-如果不进行种子设定,您将始终获得相同的序列。@JesperJuhl我必须对其进行种子设定吗?我使用随机库,我希望对generate_random_individual的每个调用都有不同的输出。似乎此lampda函数使用相同的生成器,因为它通过lampda调用获取这些生成器,因此它应该返回不同的随机值(请参阅两个调用:std::cout您需要创建最少的示例。是的,您必须对它们进行种子设定,否则程序的每次调用都将具有相同的值。此外,您需要重用生成器,而不要重新创建它们,因为这将再次重置随机序列。“您可能想看看boost random类提供了什么。”没有比当前标准IMO更好的了。是的。不要重新生成生成器。重新使用它们(并正确地为它们设定种子-一次)。我真的重新生成了生成器?如果你能为我指出,我应该在哪里这样做?你调用构造函数生成器()的每个地方您正在创建一个新的生成器。您应该传递一个生成器作为引用,而不是调用构造函数。@并且我仅在创建generators变量时使用generator()。之后,我使用lampda函数generate_random_individual中重载()的每个生成器…“您可能想看看boost random类提供了什么”没有比当前标准IMO更好的了。是的。不要重新生成生成器。重新使用它们(并正确地为它们设定种子-一次)。我真的重新生成了生成器?如果你能为我指出,我应该在哪里这样做?你调用构造函数生成器()的每个地方您正在创建一个新的生成器。您应该传递一个生成器作为引用,而不是调用构造函数。@AND并且我仅在创建generators变量时使用generator()。之后,我使用lampda函数generate\u random\u individual中重载()的每个生成器。。。