Randrange whitin静态方法

时间:2015-01-22 01:57:42

标签: 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())

2 个答案:

答案 0 :(得分:0)

位是二进制数字,因此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

答案 1 :(得分:0)

您正在生成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

这基本上用{0}填充e = '0000000000001000',使其长度为16.在我们的示例中,return int(e + "0"*(16), 2)

2**i

首先,在二进制表示的末尾添加十六个零。这样做的结果是 2**(16 + i)并将其设为import random def rand_16_bit_int(): return random.randrange(2**16) 。然后将其转换为整数。这就是为什么你的所有十六进制表示看起来都一样。

如果要生成随机的16位数,请尝试以下方法:

Util

最后,我不确定staticmethod类和rand_16_bit_int的目的是什么......或许你来自Java,你必须把所有你在课堂上的方法。在python中不是这样。将{{1}}定义为模块中的自由函数就足够了。