Okay, there are two quite different uses for RNGs:
- (scientific) simulations and games
- cryptography
For the former, quality of randomness (evenness of distribution and independence of samples) can be important. Performance is sometimes important. Having several well-known, seedable generators is useful (e.g. once I reproduced results from a MATLAB stochastic model using MT19937 in C++, thus proving the new implementation matched the old).
For the latter, I suspect many of you know more than me, but as I understand it, there are essentially two uses: (1) get a very high quality random number, likely using OS support, and (2) get a pretty good random number more quickly using a cryptographically-proven RNG.
There’s another dimension to generators: interaction with threads. If you want a crypto-RN in a multi-threaded app, the thread_rng approach works fine (as I understand it). If you want a deterministic simulation using an RNG, well, it’s hard to use any randomness in threads at all, but it may be possible by creating a “sub-RNG” at specific points seeded from a master-RNG (using a different algorithm to ensure indepedence of samples from the master RNG), and passing the sub-RNG to a worker thread.