Python 3.6、 新しいモジュール、secrets
に追加されました。
このモジュールを使用して範囲_[n, m)
_のランダム整数を生成する最も効率的な方法は何ですか?
choice(range(n, m))
を試しましたが、それが最善の方法ではないかと思います。
range
はPython 3で怠惰なので、secrets.choice(range(n, m))
は問題ないはずです。
n + secrets.randbelow(m-n)
は別のオプションです。明らかに正しくないので、私はそれを使用しません。
secrets
はSystemRandom
クラスへのアクセスをrandom.Random
と同じインターフェースで提供するため、独自のSystemRandom
インスタンスを保持することもできます。
my_secure_rng = secrets.SystemRandom()
そして、やります
my_secure_rng.randrange(n, m)
import secrets
num = secrets.randbelow(50)
print(num)
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.