mardi 4 février 2020

Proper design of RNG helper in C++

In my project, I want to have some kind of helper functions/class to work with random number generator. Main topic of the project is Monte Carlo simulations so I will be using it very often and in many places. Hence, I'm looking for ideas of designing such wrapper on C++ random library so I can randomize e.g. probability by calling simple function generateProbability(). I've came with 2 ideas, one is just class with needed functions. This solution looks nice, however I would have to create separate RNG objects inside every file/place what it's needed. The other solution is just creating separate namespace with global variables of pseudo-random engine, distributions and helper functions. I've prepared example code for both cases:

#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;
};

What do you think about these solutions? Which one is 'better' in a way that it's more professional and considered as 'cleaner'? Or maybe you have other ideas on how to do that better?

I encourage you to discussion because I can see both pros and cons of either solution and can't decide which one should I pick.




Aucun commentaire:

Enregistrer un commentaire