There is a common myth on the Internet that seeding a Mersenne twister pseudo-random number generator with a single 32-bit number is invalid because its state contains 624 32-bit numbers. That is not true. Now I will just show the example.

#include <random>

using namespace std;

int main()
{
	// seed
	auto g = mt19937{random_device()()}; // as simple as this
	
	// distribution
	auto u = uniform_real_distribution<>();
	
	// use
	for(auto i = 0; i != 100; ++i) {
		auto value = u(g);
	}
}

In its original design from 1998, a problem was discovered when using the generator with initial state that is not random enough, e.g. one integer and everything else zero. The problem was that the first few thousand generated numbers were not of good quality.

This seeding problem was later fixed in 2002, and a special algorithm was introduced just for seeding with a single value. The C++ standard mandates this fixed version.

If you really need more randomness for the initial state, use seed_seq with 2-8 values taken from random_device (64-256 bits).

int main()
{
	// seed
	random_device rd;
	seed_seq sd{rd(), rd(), rd(), rd()}; // 4 values are enough. 8 max.
	auto g = mt19937(sd); // advanced seeding
}

Seeding the wrong way

Do not fill the whole state, the 624 integers, with values from random_device. You are just wasting the OS randomness that way.

#include <random>

using namespace std;

int main()
{
	random_device rd;
	auto v = vector<unsigned int>(624); // no need for this large seed
	for(auto& a: v)
		a = rd();
	seed_seq sd(begin(v), end(v));
	auto g = mt19937(sd);
}