Franz Wexler
Franz Wexler

Reputation: 1252

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.

Upvotes: 20

Views: 24920

Answers (4)

jack
jack

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

A Tsang
A Tsang

Reputation: 85

import secrets
num = secrets.randbelow(50)
print(num)

Upvotes: 5

Dimitris Fasarakis Hilliard
Dimitris Fasarakis Hilliard

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

user2357112
user2357112

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

Related Questions