#include <vector>
#include <random>
#include <iostream>
#include <iomanip>

struct Die
{
    Die(unsigned faces = 6) : _faces(faces), _die(std::random_device()()) {}
    Die(const Die& d) : _faces(d._faces), _die(std::random_device()()) {}

    unsigned operator()() { return std::uniform_int_distribution<unsigned>(1, _faces)(_die); }

private:
    unsigned _faces;
    std::mt19937 _die;
};

int main()
{
    const unsigned trials = 100000;
    const unsigned faces = 6;
    const unsigned num_dice = 6;

    std::vector<Die> dice(num_dice, Die(faces));
    std::vector<unsigned> counts(faces * num_dice + 1);

    for (unsigned i = 0; i < trials; ++i)
    {
        unsigned rolls = 0;
        for (auto& die : dice)
            rolls += die();
        
        ++counts[rolls];
    }

    std::cout << "Counts\n";

    for (unsigned i = num_dice; i < counts.size(); ++i)
    {
        std::cout << std::setw(2) << i << ": ";
        std::cout << std::setw(6) << counts[i] << " - ";
        std::cout << std::setw(5) << std::fixed << std::setprecision(2);
        std::cout << (counts[i] / (double) trials)*100.0 << "%\n";
    }
}