All of the C++ <random> random number engines satisfy the C++ standard requirement for being a random number bit generator, a function object returning unsigned integer values such that each value in the range of possible results has (ideally) equal probability.
https://en.cppreference.com/w/cpp/named_req/UniformRandomBitGenerator
The engines are not intended to be used directly as psuedo-random number generators (PRNGs)*, they are used to supply bits to a random number distribution object to generate random numbers.
You could use
rand() by itself, but a distribution clamp is more often used to generate random numbers in a given range (a distribution):
int num = rand() % RANGE + STARTING_PLACE;
The C-library -- srand()/rand() -- is not a good random generator. Even the C standard recommends not using it.
https://web.archive.org/web/20180123103235/http://cpp.indi.frih.net/blog/2014/12/the-bell-has-tolled-for-rand/
Instead of just one random generator C++ has several pre-defined engines. Along with several adaptors that modify how the pseudo-random numbers are generated.
The C++
<random> library also has several distributions pre-defined, including the ability to generate random floating point numbers. The C-library can't do that.
*
<random> has one engine that can be used directly to generate random numbers:
std::random_device. It is not recommended for generating more than a handful of random numbers, such as serving as a seed for the PRNG engines.