Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import tkinter
- from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
- from matplotlib.figure import Figure
- import matplotlib.pyplot as plt
- import random
- def mid_square(init):
- """Middle-square generator"""
- depth = len(str(init))
- start = depth // 2
- init_seed = last = init
- while True:
- last = init
- square_str = str(init * init).zfill(depth*2)
- mid_str = square_str[start:start+depth]
- init = int(mid_str)
- if init == last :
- init = init_seed
- else :
- yield float('0.'+ mid_str)
- def mid_multi(init):
- """Middle-multiplication generator"""
- depth = len(str(init))
- start = depth // 2
- init_seed = last = init
- while True:
- multi_str = str(last * init).zfill(depth*2)
- mid_str = multi_str[start:start+depth]
- last = init
- init = int(mid_str)
- if init == last :
- init = last = init_seed
- else :
- yield float('0.'+ mid_str)
- def mix_sum(init):
- """Mixing generator"""
- l = len(str(init))
- div = 10**(l-2)
- mod = 100
- while True:
- beg = init // div
- end = init % mod
- left = init // mod
- right = init % div
- a = right * mod + beg
- b = end * div + left
- init = a + b
- yield float('0.'+ str(init)[-l:])
- def lcg(modulus, a, c, seed):
- """Linear congruential generator"""
- while True:
- seed = (a * seed + c) % modulus
- yield seed / modulus
- lcg_gen = lcg(2**32, 1664525, 1013904223, 0)
- mid_square_gen = mid_square(36149212)
- mid_multi_gen = mid_multi(111111)
- mix_sum_gen = mix_sum(12)
- root = tkinter.Tk()
- root.wm_title("Embedding in Tk")
- fig, ax = plt.subplots(2,1,sharey=True, tight_layout=True)
- fig.canvas.set_window_title('Графики ГПСЧ')
- canvas = FigureCanvasTkAgg(fig, master=root)
- canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)
- bins = 20
- n = 1000
- CURRENT = 0
- def method(title, fu) :
- return {'title': title, 'fu': fu}
- methods = []
- methods.append(method('Срединные квадраты', lambda: next(mid_square_gen)))
- methods.append(method('Срединные произведения', lambda: next(mid_multi_gen)))
- methods.append(method('Метод перемешивания', lambda: next(mix_sum_gen)))
- methods.append(method('Линейно конгруэнтный', lambda: next(lcg_gen)))
- methods.append(method('random()', random.random))
- def set_data(length, method = None):
- global CURRENT
- if method != None:
- CURRENT = method
- ax[0].clear()
- ax[0].set_title(methods[-1]['title'])
- # ax[0].hist([methods[-1]['fu']() for gen in range(length)],bins)
- ax[0].scatter(range(length),[methods[-1]['fu']() for gen in range(length)],s=1)
- ax[1].clear()
- ax[1].set_title(methods[CURRENT]['title'])
- # ax[1].hist([methods[CURRENT]['fu']() for gen in range(length)],bins)
- ax[1].scatter(range(length),[methods[CURRENT]['fu']() for gen in range(length)],s=1)
- canvas.draw()
- set_data(n)
- message = tkinter.StringVar()
- def _input(event = None, set_gen = None):
- try:
- n = int(message.get())
- except ValueError:
- return
- if n < 0:
- return
- if set_gen != None:
- CURRENT = int(set_gen)
- set_data(n, set_gen)
- f_methods = tkinter.Frame()
- meth_buts = []
- for i in range(len(methods)-1):
- x = i // 2
- y = i % 2
- meth_buts.append(tkinter.Button(f_methods,text=methods[i]['title'], width=22, command=lambda i=i: _input(set_gen = i)))
- meth_buts[i].grid(row=x, column=y)
- f_input = tkinter.Frame()
- label = tkinter.Label(f_input,text='Длина')
- text = tkinter.Entry(f_input,textvariable=message)
- button = tkinter.Button(f_input,text="OK", command=_input)
- button.config(width=4)
- text.insert(tkinter.END, str(n))
- text.bind('<Return>', _input)
- label.pack(side=tkinter.LEFT, padx=10, pady=5)
- text.pack(side=tkinter.LEFT, padx=1, pady=5)
- button.pack(side=tkinter.LEFT, padx=10, pady=5)
- f_input.pack(side=tkinter.BOTTOM, pady=5)
- f_methods.pack(side=tkinter.BOTTOM, pady=5)
- text.focus_set()
- tkinter.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement