在Python 3.6中,添加了new module, secrets。使用此模块生成[n, m)范围内的随机整数的最有效方法是什么?我试过choice(range(n, m)),但我怀疑这是最好的方法。
secrets
[n, m)
choice(range(n, m))
atmip9wb1#
secrets.choice(range(n, m))应该没问题,因为range在Python 3上是惰性的。n + secrets.randbelow(m-n)是另一个选项。我不会使用它,因为它的正确性不太明显。由于secrets提供了对SystemRandom类的访问,并且具有与random.Random相同的接口,因此您还可以保留自己的SystemRandom示例:
secrets.choice(range(n, m))
range
n + secrets.randbelow(m-n)
SystemRandom
random.Random
my_secure_rng = secrets.SystemRandom()
而且做了
my_secure_rng.randrange(n, m)
kpbwa7wx2#
secret模块提供与random相同的接口;下面的随机数发生器刚刚被改变为SystemRandom,其在密码学上是强的。简而言之,在需要更多安全性的情况下,可以像random一样使用它;我怀疑choice的性能会受到如此大的影响,以至于值得您关注。
secret
random
choice
zaq34kh63#
import secrets num = secrets.randbelow(50) print(num)
fkvaft9z4#
没有足够的代表进行评论,但如果您运行快速执行时间测试,他们实际上报告基本相同,则可以补充用户2357112的答案。
Best of 3 trials with 1,000,000 loops per trial: randrange() 1.39906 seconds total time. choice() 1.39431 seconds total time.
4条答案
按热度按时间atmip9wb1#
secrets.choice(range(n, m))
应该没问题,因为range
在Python 3上是惰性的。n + secrets.randbelow(m-n)
是另一个选项。我不会使用它,因为它的正确性不太明显。由于
secrets
提供了对SystemRandom
类的访问,并且具有与random.Random
相同的接口,因此您还可以保留自己的SystemRandom
示例:而且做了
kpbwa7wx2#
secret
模块提供与random
相同的接口;下面的随机数发生器刚刚被改变为SystemRandom
,其在密码学上是强的。简而言之,在需要更多安全性的情况下,可以像
random
一样使用它;我怀疑choice
的性能会受到如此大的影响,以至于值得您关注。zaq34kh63#
fkvaft9z4#
没有足够的代表进行评论,但如果您运行快速执行时间测试,他们实际上报告基本相同,则可以补充用户2357112的答案。