静态方法范围内的随机选择

2024-04-25 02:23:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个方法(在Python中)get_16bit_error,用于生成16位的随机整数。我试图理解为什么这段代码总是输出“相似”的数字。例如,当我运行此代码两次时,得到0x10000、0x100000或0x800000、0x8000000

class Util(object):
    @staticmethod
    def get_16bit_error():
        i = randrange(0, 16)
        e = bin(2 ** i)[2:]
        len_e = len(e)
        e = "0"*(16 - len_e) + e
        return int(e + "0"*(16), 2)
for i in range(2):
    print hex(Util.get_16bit_error())

Tags: 方法代码getlenreturnbinobjectdef
2条回答

您正在生成2**(16 + randrange(0,16))形式的数字。我猜那不是你想要的。我们来分解一下:

i = randrange(0, 16)

i是一个介于0和16之间的随机数。到目前为止还不错。让我们继续假设i = 3

e = bin(2 ** i)[2:]

现在你已经将2乘以i(在我们的例子中,2**i = 8)。然后将其转换为二进制表示,并获取字符串的后端,因此e = 1000

len_e = len(e)

e的长度,在我们的示例中是4

e = "0"*(16 - len_e) + e

这实际上是用零填充e,这样它的长度就为16

return int(e + "0"*(16), 2)

首先在二进制表示的末尾加十六个零。这有一个效果,就是服用原来的2**i并使之成为2**(16 + i)。然后将其转换为整数。这就是为什么你所有的十六进制表示看起来都一样

如果要生成随机16位数字,请尝试以下操作:

import random
def rand_16_bit_int():
    return random.randrange(2**16)

最后,我不确定Util类和staticmethod的目的是什么。。。也许您来自Java,您必须将所有方法都放在类中。在python中并非如此。在模块中将rand_16_bit_int定义为自由函数就足够了

位是一个二进制数字,所以16位是16个二进制数字

import random

class Util(object):

    @staticmethod
    def get_16bit_error():
        string = ''
        for i in range(16):
            string += random.choice(['1', '0'])
        return '0b' + string


the_binary = hex(Util.get_16bit_error())
in_decimal = print int(the_binary, 2)

print the_binary # or in_decimal

相关问题 更多 >