Правильный дизайн помощника RNG в C ++ - PullRequest
1 голос
/ 05 февраля 2020

В моем проекте я хочу иметь какие-то вспомогательные функции / классы для работы с генератором случайных чисел. Главная тема c проекта - симуляции Монте-Карло, поэтому я буду использовать ее очень часто и во многих местах. Следовательно, я ищу идеи создания такой оболочки на случайной библиотеке C ++, чтобы я мог рандомизировать, например, вероятность, вызывая простую функцию generateProbability(). Я пришел с 2 идеями, одна просто класс с необходимыми функциями. Это решение выглядит неплохо, однако мне нужно было бы создавать отдельные объекты RNG внутри каждого файла / места, где это необходимо. Другое решение - просто создать отдельное пространство имен с глобальными переменными псевдослучайного движка, распределений и вспомогательных функций. Я подготовил пример кода для обоих случаев:

#pragma once
#include <random>

namespace rng {

std::mt19937_64 rng_engine(std::random_device{}());
std::uniform_int_distribution<uint8_t> zeroToNineDistrib(0, 9);

inline auto generateNumber() { return zeroToNineDistrib(rng_engine); }

} // namespace rng

class RNG {
public:
  RNG() : rng_engine(std::random_device{}()), zeroToNineDistrib(0, 9){};
  ~RNG() = default;

  auto generateNumber() { return zeroToNineDistrib(rng_engine); }

private:
  std::mt19937_64 rng_engine;
  std::uniform_int_distribution<uint8_t> zeroToNineDistrib;
};

Что вы думаете об этих решениях? Какой из них «лучше» таким образом, что он более профессиональный и считается «чище»? Или, может быть, у вас есть другие идеи о том, как сделать это лучше?

Я призываю вас к обсуждению, потому что я вижу плюсы и минусы любого решения и не могу решить, какой из них выбрать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...