You are on page 1of 7

Міністерство освіти і науки України

Національний технічний університет України


«Київський політехнічний інститут ім. Ігоря Сікорського»
Факультет інформатики та обчислювальної техніки
Кафедра обчислювальної техніки

ЛАБОРАТОРНА РОБОТА № 1

з дисципліни «Теорія імовірності» на тему


«Генератор псевдовипадкових двійкових
послідовностей»

ВИКОНАЛА:
студентка ІІ курсу ФІОТ
групи ІО-64
Бровченко Анастасія
Залікова - 6403

ПЕРЕВІРИВ:
доц. Марковський О.П.

Київ – 2017
Завдання

Генератор: стартстопний рознесений


Розрядність: 12
Довжина вибірки: 10000
Тест на складність: нелінійний

Код програми

Файл startstopnyy_gen_functions
def lfsr_r_tact(sequence: str):
"""Виконує один такт LFSR з рознесеним зворотним зв'язком.
sequence - бінарна початкова послідовність."""

sequence = list(sequence)
random_num = sequence[0]
for i in [6, 4, 1]:
if (sequence[0] == '1') & (sequence[len(sequence)-i] == '1'):
sequence[len(sequence)-i] = '0'
else:
sequence[len(sequence)-i] = str(int(sequence[len(sequence)-i]) +
int(sequence[0]))
sequence = ''.join(sequence)
sequence = sequence[1:] + sequence[0]
return [sequence, random_num]

def startstop_generator(basic_num: str, extra_num:str,


length_of_random_sequence: int):
"""Стартстопний генератор.
basic_num - початкова бінарна послідовність основної LFSR,
extra_num - початкова бінарна послідовність додаткової LFSR,
length_of_random_sequence - довжина генерованої бінарної
послідовності."""

random_sequence = str()
while len(random_sequence) < length_of_random_sequence:
extra_tact = lfsr_r_tact(extra_num)
if extra_tact[1] == '1':
basic_tact = lfsr_r_tact(basic_num)
random_sequence += str(basic_tact[1])
basic_num = basic_tact[0]
extra_num = extra_tact[0]
return random_sequence

def frequency_test(sequence: str):


"""Частотний тест."""

number_1 = 0
for i in sequence:
if i == '1':
number_1 += 1
return 'Одиниць --> {n}/{all}\n' \
'Нулів -------> {m}/{all}'.format(n=number_1, all=len(sequence),
m=len(sequence)-number_1)
def differential_frequency_test(sequence: str):
"""Диференційний частотний тест."""

num_changes = 0
for i in list(range(len(sequence)-1)):
if sequence[i] != sequence[i+1]:
num_changes += 1
return ' {}/{}'.format(num_changes, (len(sequence)-1))

# розмір вікна = 5
def window_test(sequence: str):
"""Віконний тест."""

possible_windows = {'00000': 0, '00001': 0, '00010': 0, '00011': 0,


'00100': 0, '00101': 0, '00110': 0, '00111': 0,
'01000': 0, '01001': 0, '01010': 0, '01011': 0,
'01100': 0, '01101': 0, '01110': 0, '01111': 0,
'10000': 0, '10001': 0, '10010': 0, '10011': 0,
'10100': 0, '10101': 0, '10110': 0, '10111': 0,
'11000': 0, '11001': 0, '11010': 0, '11011': 0,
'11100': 0, '11101': 0, '11110': 0, '11111': 0}
for i in list(range(len(sequence)-4)):
possible_windows[sequence[i:i+5]] += 1
i += 1
for j in list(possible_windows.keys()):
possible_windows[j] = '{}/{}'.format(possible_windows[j], 32)
l = sorted(possible_windows.keys())
result = ''
for i in l:
result = result + '{} -> {}\n'.format(i, possible_windows[i])
return result

def complexity_test_nonlinear(sequence: str):


"""Нелінійний тест на складність."""

len_of_comb = 1
pointer = 0

def create_combinations(len_of_window: int):


comb_dict = {}
for i in range(2**len_of_window):
x = str(bin(i))[2:]
if len(x) < len_of_window:
x = '0'*(len_of_window - len(x)) + x
comb_dict[x] = 'X'
return comb_dict
combinations = create_combinations(len_of_comb)

while pointer in range(len(sequence)-len_of_comb):


if combinations[sequence[pointer:pointer + len_of_comb]] == 'X':
combinations[sequence[pointer:pointer+len_of_comb]] =
sequence[pointer+len_of_comb]
elif (combinations[sequence[pointer:pointer+len_of_comb]] != 'X') & \
(combinations[sequence[pointer:pointer+len_of_comb]] !=
sequence[pointer+len_of_comb]):
len_of_comb += 1
combinations = create_combinations(len_of_comb)
pointer = 0
else: pointer += 1

c = sorted(combinations.keys())
comb_result = ''
for i in c:
comb_result = comb_result + '{} --> {} \n'.format(i,
combinations[i])

return 'Кількість бітів, від яких залежить наступний біт ---> {}\n\n' \
'{}'.format(len_of_comb, comb_result)

Файл GUI
from tkinter import *
import random, third_sem.teor_ver.startstopnyy_gen_functions as func

def show_sequence():
slave = Toplevel(root)
slave.focus_set()
slave.title('Згенерована бінарна послідовність')
slave['bg'] = 'mint cream'
t = Text(slave, font='Corbel 12', bg='mint cream')
t.pack(side=LEFT, fill=BOTH, padx=10)

t.insert(INSERT, sequence)

s = Scrollbar(slave)
s.pack(side=RIGHT, fill=Y)
s.config(command=t.yview)
t.config(yscrollcommand=s.set)

def but_bind():
root.maxsize(430, 450)
root.minsize(430, 450)

if len(ent_extra.get()) == len(ent_basic.get()) == 12:


global basic_num, extra_num, sequence
ent_basic['state'] = DISABLED
ent_extra['state'] = DISABLED
quantity['state'] = DISABLED
basic_num = ent_basic.get()
extra_num = ent_extra.get()
sequence = func.startstop_generator(ent_basic.get(), ent_extra.get(),
int(quantity.get()))

Label(root, text='__________________________________', font='Arial


16', bg='mint cream')\
.grid(row=9, column=1, columnspan=2, padx=10)
Button(root, text='Послідовність', font='Arial 12 bold', bg='green
yellow', command=show_sequence) \
.grid(row=10, column=1, columnspan=2, pady=10, sticky=W, padx=30)
Button(root, text='Результати тестування', font='Arial 12 bold',
bg='green yellow', command=window_tests)\
.grid(row=10, column=1, columnspan=2, pady=10, sticky=E, padx=30)
else:
Label(root, text='Неправильно введені дані.', fg='red', font='Arial
12', bg='mint cream')\
.grid(row=9, column=1, sticky=W)

def random_sequence(length):
l = ''
for i in range(length):
l = l + str(random.choice([1, 0]))
return l

def but_random_basic():
ent_basic.delete(0, END)
ent_basic.insert(END, random_sequence(12))

def but_random_extra():
ent_extra.delete(0, END)
ent_extra.insert(END, random_sequence(12))

def window_tests():
slave = Toplevel(root)
slave.focus_set()
slave.title('Результати тестування')
slave['bg'] = 'mint cream'
t = Text(slave, font='Corbel 12', bg='mint cream')
t.pack(side=LEFT, fill=BOTH, padx=10)
t.insert(INSERT, 'Результат частотного тесту:\n{t1}\n\n'
'Результат диференційного частотного тесту: {t2}\n\n'
'Результат віконного тесту:\n{t3}\n\n'
'Результат нелінійного тесту на складність:\n\n{t4}\n\n'
.format(t1=func.frequency_test(sequence),
t2=func.differential_frequency_test(sequence),
t3=func.window_test(sequence),
t4=func.complexity_test_nonlinear(sequence)))
t.tag_add('tag1', '1.0', '1.50')
t.tag_add('tag2', '5.0', '5.42')
t.tag_add('tag3', '7.0', '7.50')
t.tag_add('tag4', '42.0', '42.50')
t.tag_config('tag1', font='Corbel 14 bold')
t.tag_config('tag2', font='Corbel 14 bold')
t.tag_config('tag3', font='Corbel 14 bold')
t.tag_config('tag4', font='Corbel 14 bold')
s = Scrollbar(slave)
s.pack(side=RIGHT, fill=Y)
s.config(command=t.yview)
t.config(yscrollcommand=s.set)

root = Tk()
root.title('Параметри')
root['bg'] = 'mint cream'
root.maxsize(430, 340)
root.minsize(430, 340)
Label(root, text='Основна послідовність з 12 чисел', font='Arial 14',
bg='mint cream')\
.grid(row=1, column=1, columnspan=2, pady=10, padx=10)
Label(root, text='Додаткова послідовність з 12 чисел', font='Arial 14',
bg='mint cream')\
.grid(row=3, column=1, columnspan=2, pady=10, padx=10)
Label(root, text='Довжина генерованої послідовності', font='Arial 14',
bg='mint cream')\
.grid(row=5, column=1, columnspan=2, pady=10, padx=10)

ent_basic = Entry(root, width=30, bd=3, bg='light cyan', font='Arial 13')


ent_basic.grid(row=2, column=1, sticky=W, padx=10)
ent_extra = Entry(root, width=30, bd=3, bg='light cyan', font='Arial 13')
ent_extra.grid(row=4, column=1, sticky=W, padx=10)
quantity = Entry(root, width=30, bd=3, bg='light cyan', font='Arial 13')
quantity.grid(row=6, column=1, sticky=W, padx=10)
quantity.insert(END, '10000')

Button(root, text='Випадково', font='Arial 12 bold',


command=but_random_basic, bg='pale green')\
.grid(row=2, column=2, sticky=W, pady=10, padx=10)
Button(root, text='Випадково', font='Arial 12 bold',
command=but_random_extra, bg='pale green')\
.grid(row=4, column=2, sticky=W, pady=10, padx=10)

Button(root, text='OK', font='Arial 14 bold', command=but_bind, bg='pale


green').grid(row=8, columnspan=2, column=1, pady=15)

root.mainloop()

Результат роботи програми

You might also like