C++ supports several programming paradigms (including);
- OO based techniques
- Generic and template programming
- Procedural style programming (coming from C)
Using any of these techniques where is appropriate is not going to be "overkill". The broader question is more what design or pattern would be appropriate for the problem being solved, given the context of the current implementation and domain specific constraints?
Since you are looking at this from a learning exercise, creating a class for dice would be fine, the object maps well to a physical thing - so go for it.
Would I create a class in a production application if all I wanted was two random numbers - maybe. I would use a function that returned a std::pair
(std::pair<int,int> get_random(...)
) and either provide the functions with the appropriate engine and distribution requirements as arguments, else have those arguments in an object to assist with the state management.