You have made many correct observations already!

Unless you’d like to seed both of the random generators, it’s probably simpler in the long run to choose one generator or the other. But if you do need to use both, then yes, you’ll also need to seed them both, because they generate random numbers independently of each other.

For `numpy.random.seed()`

, the main difficulty is that it is not thread-safe – that is, it’s not safe to use if you have many different threads of execution, because it’s not guaranteed to work if two different threads are executing the function at the same time. If you’re not using threads, and if you can reasonably expect that you won’t need to rewrite your program this way in the future, `numpy.random.seed()`

should be fine. If there’s any reason to suspect that you may need threads in the future, it’s much safer in the long run to do as suggested, and to make a local instance of the `numpy.random.Random`

class. As far as I can tell, `random.random.seed()`

is thread-safe (or at least, I haven’t found any evidence to the contrary).

The `numpy.random`

library contains a few extra probability distributions commonly used in scientific research, as well as a couple of convenience functions for generating arrays of random data. The `random.random`

library is a little more lightweight, and should be fine if you’re not doing scientific research or other kinds of work in statistics.

Otherwise, they both use the Mersenne twister sequence to generate their random numbers, and they’re both completely deterministic – that is, if you know a few key bits of information, it’s possible to predict with absolute certainty what number will come next. For this reason, neither numpy.random nor random.random is suitable for any serious cryptographic uses. But because the sequence is so very very long, both are fine for generating random numbers in cases where you aren’t worried about people trying to reverse-engineer your data. This is also the reason for the necessity to seed the random value – if you start in the same place each time, you’ll always get the same sequence of random numbers!

As a side note, if you *do* need cryptographic level randomness, you should use the secrets module, or something like Crypto.Random if you’re using a Python version earlier than Python 3.6.