python - getrandbits 不产生恒定长度的数字

标签 python random

我使用 python 2.6.6。我使用 getrandbits(128) 来获取 128 位随机数。

a = random.getrandbits(128)

但是,位数并不总是 128。有时会少于此。这是什么原因?有没有更稳定的库?

最佳答案

这 128 位中的每一位都可以是 0 或 1;如果最左边的位为 0,则您的数字将小于 2 ** 127,但它们仍会生成。这是预期的并且是完全正常的行为。

如果您需要最左边的位始终为 1,请使用 randrange()相反:

a = random.randrange(1 << 127, 1 << 128)

这会生成一个保证第一位设置为 1 的数字。或者,生成一个 127 位的数字并添加 1 << 127对它:

a = random.getrandbits(127) + (1 << 127)

您可以在格式化 getrandbits() 时看到此行为使用 format() 输出为 0 填充的二进制文件编号:

>>> format(random.getrandbits(8), '08b')
'00011110'
>>> format(random.getrandbits(8), '08b')
'01000010'
>>> format(random.getrandbits(8), '08b')
'00110010'
>>> format(random.getrandbits(8), '08b')
'10101010'
>>> format(random.getrandbits(8), '08b')
'10000110'

数字是完全随机的,但有时最左边的位最终会是 0 .通过生成少 1 位,并将最左边的位添加为 1,您可以生成的随机值数量减半,但保证您看到“所有”位:

>>> format(random.getrandbits(7) + (1 << 8), '08b')
'100010110'
>>> format(random.getrandbits(7) + (1 << 8), '08b')
'101111101'
>>> format(random.getrandbits(7) + (1 << 8), '08b')
'101000111'
>>> format(random.getrandbits(7) + (1 << 8), '08b')
'101011111'

这完全取决于您想要做什么。

关于python - getrandbits 不产生恒定长度的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17125237/

相关文章:

delphi - delphi 生成随机数

python - 打乱二维数组

生成单词的Python脚本

python - python 时区转换有什么问题?

python - 如何使用 Python 的 scipy.integrate.quad 评估多元函数的单积分?

javascript 链接在点击时不起作用;页面加载时功能有效

math - 寻找线性同余系统等分布解的算法

python - Django ORM 是否将删除的字段映射到 sql where 子句中的其他字段之前?

Python - 返回 lst 中仅包含整数的列表列表?

swift - 阻止相同的随机 int 连续出现两次