Как напечатать двоичное число списка с заданной вероятностью ошибки (Python) - PullRequest
0 голосов
/ 20 января 2020

Если у меня есть список двоичных чисел (0 и 1). И мне нужно распечатать эти числа с вероятностью p (p = 1-вероятность ошибки в канале).

Если вероятность ошибки = 0,2 (p = 0,8) и последовательность равна 101010101010, решение будет что-то вроде 101011101000 ...


Per = float(input("Introduzca probabilidad de error: "))
while Per > 1 or Per < 0:
    print("P.error ha de tener un valor comprendido entre 0 y 1/2")
    Per = float(input("Introduzca probabilidad de error: "))

q = 1 - Per
import random

entrada = int(input("Introduzca manualmente secuencia de bits: "),2)
bits = [int(x) for x in bin(entrada)[2:]]

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Попробуйте:

import random
tot = len(entrada)
approx= round(Per*tot)

temp = list(entrada)
entrada = list(entrada)
for i in random.sample(range(0,tot),approx):
  if entrada[i]=='1':
    entrada[i]='0'
  else:
    entrada[i]='1'

count = 0
for i in range(len(entrada)):
  if(temp[i]!=entrada[i]):
    count+=1

entrada =''.join(entrada)
print('modified entrada is : ',entrada)
print('error after modification is : ',round(count/len(entrada),3),' approximately..')

Вывод:

modified entrada is :  000111001011
error after modification is :  0.167  approximately..
0 голосов
/ 20 января 2020

Вы можете перебирать биты и с каждым шагом генерировать случайные значения от 0 до 1. Если ваше случайное значение меньше q, вы добавляете правильный бит в свой новый список bits_con_error. Если ваше случайное значение больше, чем q, то вы добавляете случайно сгенерированные 1 или 0, используя randint (0, 1)

Per = float(input("Introduzca probabilidad de error: "))
while Per > 1 or Per < 0:
    print("P.error ha de tener un valor comprendido entre 0 y 1/2")
    Per = float(input("Introduzca probabilidad de error: "))

q = 1 - Per
import random

entrada = int(input("Introduzca manualmente secuencia de bits: "),2)
bits = [int(x) for x in bin(entrada)[2:]]

bits_con_error = []
for bit in bits:
    if random.random() < q:
        bits_con_error.append(bit)
    else:
        bits_con_error.append(random.randint(0, 1))
print(bits_con_error)

или если ошибка в канале должна перевернуть бит, а не случайно генерируя новый бит, вы можете использовать bits_con_error.append(int(not bit))

...