Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 829
Franz Wexler Avatar asked Dec 06 '16 17:12

Franz Wexler


2 Answers

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.

like image 136
Dimitris Fasarakis Hilliard Avatar answered Oct 05 '22 03:10

Dimitris Fasarakis Hilliard


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)
like image 40
user2357112 supports Monica Avatar answered Oct 05 '22 03:10

user2357112 supports Monica