我写了一个方法(用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())
答案 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}}定义为模块中的自由函数就足够了。