Передача boost :: генератора случайных чисел в качестве параметра функции - PullRequest
0 голосов
/ 01 декабря 2018

Я хотел бы передать объект генератора чисел boost::random в функцию.Я написал эту небольшую программу, чтобы проверить, правильно ли я это делаю:

#include <cstdlib>
#include <iostream>

#include <exception>

#include <boost/random.hpp>
#include <boost/random/random_device.hpp>


// ---------- function declarations ----------
void print_random_num(boost::random::uniform_int_distribution<unsigned long> &gen, boost::random::mt19937 &rng);


// ---------- main ----------
int main()
{
        try
        {
                boost::random::random_device seeder;
                boost::random::mt19937 rng(seeder());
                boost::random::uniform_int_distribution<unsigned long> gen(100,200);

                std::cout << "in main:\n";
                for (int c = 0; c < 10; c++)
                        std::cout << gen(rng) << "\n";

                print_random_num(gen,rng);

                std::cout << "\nback in main:\n";
                for (int c = 0; c < 10; c++)
                        std::cout << gen(rng) << "\n";
        }
        catch (std::exception &e)
        {
                std::cout << "error encountered: " << e.what() << "\n";
        }

        return EXIT_SUCCESS;
}                                                                                                                                                                                                                         


// ---------- function definitions ----------                                                                                                                                                                             
void print_random_num(boost::random::uniform_int_distribution<unsigned long> &gen, boost::random::mt19937 &rng)
{
        try                                                                                                                                                                                                           
        {                                                                                                                                                                                                                 
                std::cout << "\nin function:\n";                                                                                                                                                                          
                for (int c = 0; c < 10; c++)                                                                                                                                                                              
                        std::cout << gen(rng) << "\n";                                                                                                                                                                    
        }                                                                                                                                                                                                                 
        catch (std::exception &e)
        {
                throw;
        }
}

Вывод программы предполагает, что это работает, но просто видеть на выходе случайные числа не обязательно означаетэто на самом деле работает.Итак, у меня есть два вопроса:

  1. Это путь, показанный здесь в тестовой программе, т. Е. Оба в качестве ссылки, правильный путь для передачи генератора rng и объекта распределенияgen чтобы непрерывно генерировать случайные числа по всей программе?

  2. Если бы я хотел создать такие же числа внутри функцииprint_ran_num и после выхода из функции Достаточно ли просто передать генератор по значению, т.е. изменить сигнатуру функции на void print_random_num(boost::random::uniform_int_distribution<unsigned long> &gen, boost::random::mt19937 rng)?Опять же, вывод в этом случае предполагает, что это будет работать правильно.

У меня сложилось впечатление, что я когда-то видел пример, демонстрирующий это в документации для Boost.Random, но я больше не мог его найти.

...