set random seed programwide in python

Viewed 101719

I have a rather big program, where I use functions from the random module in different files. I would like to be able to set the random seed once, at one place, to make the program always return the same results. Can that even be achieved in python?

9 Answers

Building on previous answers: be aware that many constructs can diverge execution paths, even when all seeds are controlled.

I was thinking "well I set my seeds so they're always the same, and I have no changing/external dependencies, therefore the execution path of my code should always be the same", but that's wrong.

The example that bit me was list(set(...)), where the resulting order may differ.

One important caveat is that for python versions earlier than 3.7, Dictionary keys are not deterministic. This can lead to randomness in the program or even a different order in which the random numbers are generated and therefore non-deterministic random numbers. Conclusion update python.

I was also puzzled by the question when reproducing a deep learning project.So I do a toy experiment and share the results with you.

I create two files in a project, which are named test1.py and test2.py respectively. In test1, I set random.seed(10) for the random module and print 10 random numbers for several times. As you can verify, the results are always the same.

What about test2? I do the same way except setting the seed for the random module.The results display differently every time. Howerver, as long as I import test1———even without using it, the results appear the same as in test1.

So the experiment comes the conclusion that if you want to set seed for all files in a project, you need to import the file/module that define and set the seed.

According to Jon's answer, setting random.seed(n), at the beginning of the main program will set the seed globally. Afterward to set seeds of the imported libraries, one can use the output from random.random(). For example,

rng = np.random.default_rng(int(abs(math.log(random.random()))))

tf.random.set_seed(int(abs(math.log(random.random()))))
Related