2015-01-22 2 views
0

Я написал метод (в Python) get_16bit_error для генерации случайного целого числа из 16 бит. Я пытаюсь понять, почему этот код всегда выводит «похожие» числа. Для экземпляра, когда я запускал этот код два раза, я получил 0x10000, 0x100000 или 0x800000, 0x8000000.Randrange whitin static method

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

Бит является двоичной цифрой, поэтому 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 
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 

Это essenti алликаторы e с нулями, чтобы длина была 16. В нашем примере e = '0000000000001000'.

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 здесь ... Может быть, вы» Re от Java, где вы должны поместить все свои методы в классы. Не так в питоне. Достаточно определить rand_16_bit_int как бесплатную функцию в вашем модуле.