Reputation: 1252
In Python 3.6, new module, secrets
, was added.
What is the most efficient way to generate random integer in range [n, m)
using this module?
I tried choice(range(n, m))
, but I doubt it is the best way.
Upvotes: 20
Views: 24920
Reputation: 31
Not enough rep to comment but to add on to user2357112's answer if you run a quick execution time test they actually report basically identical.
Best of 3 trials with 1,000,000 loops per trial:
randrange() 1.39906 seconds total time.
choice() 1.39431 seconds total time.
Upvotes: 3
Reputation: 160367
The secret
module provides the same interface as random
; the underlying random generator has just been changed to SystemRandom
which is cryptographically strong.
In short, use it as you would random
in circumstances that require a bit more security; I doubt choice
suffers from performance so much to warrant your concern.
Upvotes: 7
Reputation: 280181
secrets.choice(range(n, m))
should be fine, since range
is lazy on Python 3.
n + secrets.randbelow(m-n)
is another option. I wouldn't use it, since it's less obviously correct.
Since secrets
provides access to the SystemRandom
class, with the same interface as random.Random
, you can also keep your own SystemRandom
instance:
my_secure_rng = secrets.SystemRandom()
and do
my_secure_rng.randrange(n, m)
Upvotes: 25