为什么在使用随机数时会在Python中发生这种情况?我该怎样预防呢?

时间:2015-10-13 13:11:50

标签: python python-3.x random

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

CODE:

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?我该如何防止这种情况?

3 个答案:

答案 0 :(得分:4)

随机位可以是0或1,所以当左边的位是0(一半的时间)时,仍然会产生数字但是长度<1。 128 这是非常逻辑的

答案 1 :(得分:3)

正如文档所解释的那样,

random生成一个随机python,其长度为给定量。

  

random.getrandbits(k)的

     

返回一个带有k个随机位的python long int。 [...]

您使用的方法记录如下:

  

long.bit_length()

     

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

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

请注意,不建议使用random来保护安全。

答案 2 :(得分:3)

旁注for i in range(1, 128)只会给你127个密钥。使用for i in range(0, 128)

进行简单修复

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