How to use Python `secret` module to generate random integer?

Question:

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.

Asked By: Franz Wexler

||

Answers:

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)
Answered By: user2357112

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.

import secrets
num = secrets.randbelow(50)
print(num)
Answered By: A Tsang

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.
Answered By: jack
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.