web-dev-qa-db-ja.com

Python `secret`モジュールを使用してランダムな整数を生成する方法は?

Python 3.6、 新しいモジュール、secrets に追加されました。

このモジュールを使用して範囲_[n, m)_のランダム整数を生成する最も効率的な方法は何ですか?

choice(range(n, m))を試しましたが、それが最善の方法ではないかと思います。

7
Franz Wexler

rangeはPython 3で怠惰なので、secrets.choice(range(n, m))は問題ないはずです。

n + secrets.randbelow(m-n)は別のオプションです。明らかに正しくないので、私はそれを使用しません。

secretsSystemRandomクラスへのアクセスをrandom.Randomと同じインターフェースで提供するため、独自のSystemRandomインスタンスを保持することもできます。

my_secure_rng = secrets.SystemRandom()

そして、やります

my_secure_rng.randrange(n, m)
import secrets
num = secrets.randbelow(50)
print(num)
3
A Tsang

secretモジュールは、randomと同じインターフェースを提供します。基になるランダムジェネレーターは、暗号的に強力なSystemRandomに変更されました。

つまり、もう少しセキュリティが必要な状況では、randomと同じように使用します。 choiceがパフォーマンスにそれほど苦しんでいるのではないかと思います。

コメントするのに十分な担当者ではありませんが、クイック実行時間テストを実行した場合にuser2357112の回答に追加すると、実際には基本的に同じであると報告されます。

Best of 3 trials with 1,000,000 loops per trial:
        randrange() 1.39906 seconds total time.
        choice() 1.39431 seconds total time.
0
jack