Making A Random Number Generator Random Number Generator Rand.Gen.

    • distribution objects produce random numbers
    • uniform random bit engine objects act as sources of randomness
    #include <random>
    random_engine_type engine {seed};
    distribution_type distribution {parameters,…};
    auto random_value = distribution(engine);

    How to make a single random generator object that ties both a distribution object and an engine object together?

    Lambda Generator Lambda

    • initialize engine & distribution in lambda capture
    • important: lambda must be marked mutable because internal state of engine and distribution need to change with each call
    #include <random>
    // obtain some seed
    auto const seed = std::random_device{}();
    auto coin_flip = [
      // init-capture engine + distribution:
      urbg = std::mt19937{seed},
      distr = std::bernoulli_distribution{0.5}
    ]() mutable -> bool { return distr(urbg); };
    // use generator:
    bool coin = coin_flip();
    
    auto roll = [ urbg = std::mt19937{seed}, distr = std::uniform_int_distribution<int>{1,6} ]() mutable -> int { return distr(urbg); }; int num = roll();

    Custom Generator Class Custom Class

    if more control over parameters is needed

    #include <random>
    class DiceRoll {
      using engine_type = std::mt19937;
      // engine + distribution as members:
      engine_type urbg_;
      std::uniform_int_distribution<int> distr_;
    public:
      using seed_type = engine_type::result_type;
      // constructor:
      explicit 
      DiceRoll(int sides, seed_type seed = 0) noexcept: 
        urbg_{seed}, distr_{1,sides} {}
      // allows to re-seed
      void seed (seed_type s) noexcept {     urbg_.seed(s); }
      // call operator:
      int operator () () noexcept {     return distr_(urbg_); }
    };
    
    int main () {
      auto const seed = std::random_device{}();
      DiceRoll roll_d20 {20, seed};
      std::cout << roll_d20() << '\n';
    }