为什么在Python中使用random时会发生这种情况?我怎样才能预防它?

为什么在Python中使用random时会发生这种情况?我怎样才能预防它?,python,python-3.x,random,Python,Python 3.x,Random,我想创建128个由随机位组成的密钥。每个密钥的大小必须为128位。当我运行以下代码时,我注意到这个奇怪的输出: 代码: for i in range(1, 128): key = random.getrandbits(128) print("Key:", key, key.bit_length()) 输出: Key: 171015864459493129154336425209795162216 128 Key: 26565540516106682730125492298589

我想创建128个由随机位组成的密钥。每个密钥的大小必须为128位。当我运行以下代码时,我注意到这个奇怪的输出:

代码:

for i in range(1, 128):
    key = random.getrandbits(128)
    print("Key:", key, key.bit_length())
输出:

Key: 171015864459493129154336425209795162216 128
Key: 265655405161066827301254922985896430579 128
Key: 149533773555250911787517288984005312306 127
Key: 67337979537475290133339561382641205404 126
Key: 309944504326722665064876901817102187588 128
Key: 5025567194209335595020257770351824725 122
Key: 311246876593534253598386348380900720669 128
etc

为什么有些键的长度小于128?如何防止这种情况发生?

随机位可以是0或1,因此当左侧的位为0(一半时间)时,仍将生成长度小于128的数字
这是非常符合逻辑的

随机
生成一个随机的python long,其中包含给定数量的随机位,正如文档所解释的那样

random.getrandbits(k)

返回带有k个随机位的python长整型。[……]

您使用的方法记录如下:

long.bit_length()

返回用二进制表示整数所需的位数,不包括符号和前导零

因此,较短的数字实际上是带有一些前导零的随机数,这些前导零不包括在计数中


请注意,出于安全目的,不鼓励使用
random

作为范围(1128)中i的旁注
。使用
对范围(0,128)内的i进行简单修复


(我更愿意添加评论,因为没有足够的代表这么做)

讽刺的是,我现在可以评论了