В стандарте С++ 11 задается ряд различных движков для генерации случайных чисел: linear_congruential_engine, mersenne_twister_engine, subtract_with_carry_engine и т.д. Очевидно, это большое изменение от старого использования std::rand.
Очевидно, что одним из основных преимуществ (по крайней мере, некоторых) этих двигателей является увеличенная длина периода (он встроен в имя для std::mt19937).
Однако различия между двигателями менее ясны. Каковы сильные и слабые стороны различных двигателей? Когда нужно использовать друг друга? Есть ли разумное значение по умолчанию, которое обычно должно быть предпочтительным?