Альтернативой копированию генератора и распространения в лямбде является включение их в класс. Тогда они имеют то же время жизни, что и rand
class montecarlo
{
std::mt19937 gen;
std::uniform_real_distribution<double> dis;
public:
montecarlo(double x_min, double x_max);
std::function<double()> rand;
};
montecarlo::montecarlo(double x_min, double x_max)
: gen(std::random_device()),
dis(x_min, x_max),
rand([this](){ return dis(gen); })
{}
Название этого класса предполагает, что он будет заниматься другими вещами. Я не рекомендую вам расширять его, а вместо этого делить генерацию на собственный класс.
class uniform_real_generator
{
std::mt19937 gen;
std::uniform_real_distribution<double> dis;
public:
uniform_real_generator(double x_min, double x_max);
double operator();
}
uniform_real_generator::uniform_real_generator(double x_min, double x_max)
: gen(std::random_device()),
dis(x_min, x_max)
{}
double uniform_real_generator::operator()
{
return dis(gen);
}
class montecarlo
{
// other members
public:
montecarlo(double x_min, double x_max/*, other args */);
uniform_real_generator rand;
}
montecarlo::montecarlo(double x_min, double x_max/*, other args */)
: rand(x_min, x_max) //, other member initialisers
{}