9

在 Python 3.6 中,添加了新模块secrets

[n, m)使用此模块在范围内生成随机整数的最有效方法是什么?

我试过choice(range(n, m))了,但我怀疑这是最好的方法。

4

4 回答 4

15

secrets.choice(range(n, m))应该没问题,因为range在 Python 3 上很懒。

n + secrets.randbelow(m-n)是另一种选择。我不会使用它,因为它不太明显是正确的。

由于secrets提供对SystemRandom类的访问,具有与 相同的接口random.Random,您还可以保留自己的SystemRandom实例:

my_secure_rng = secrets.SystemRandom()

my_secure_rng.randrange(n, m)
于 2016-12-06T17:47:22.230 回答
4

secret模块提供与 ; 相同的接口random。底层随机生成器刚刚更改SystemRandom为加密强度高的随机生成器。

简而言之,random在需要更多安全性的情况下使用它;我怀疑choice性能受到如此大的影响以保证您的关注。

于 2016-12-06T17:48:08.087 回答
4
import secrets
num = secrets.randbelow(50)
print(num)
于 2017-01-26T18:58:53.383 回答
2

如果您运行快速执行时间测试,他们实际上报告基本相同,没有足够的代表发表评论但添加到 user2357112 的答案。

Best of 3 trials with 1,000,000 loops per trial:
        randrange() 1.39906 seconds total time.
        choice() 1.39431 seconds total time.
于 2019-05-31T04:55:01.290 回答