#!/usr/bin/env python36 # import tkinter as tk import random from statistics import mean persons = 10 consider_persons = 3 class Person: def __init__(self): self.angle = random.randint(0, 359) self._hash = hash(self.angle) self.person_before = None def distance(self, howfar=1): """return Distance of some 2 members ahead""" if howfar == 1: return (self.person_before.angle - self.angle) % 360 if howfar > 1: return self.person_before.distance(howfar - 1) else: raise RuntimeError("howfar my not be 0 or less") def avg(self, howfar=1): dists = [] for i in range(1, howfar + 1): dists.append(self.distance(howfar=i)) return mean(dists) def go_step(self, _min=1): # step = random.randint(_min, _max) step = self.avg() self.angle += step self.angle %= 360 def __hash__(self): return self._hash def __eq__(self, other): return self.angle == other.angle class Group: def __init__(self, persons): self.persons = persons self.optimaldist = 360 / persons self.fmt = " / ".join(("%d: %2d",) * self.persons) ps = set() while len(ps) < persons: ps.add(Person()) perslist = sorted(ps, key=lambda x: x.angle) for i in range(0, len(perslist) - 1): perslist[i].person_before = perslist[i + 1] perslist[-1].person_before = perslist[0] self.ps = perslist def avg_error(self): return mean([abs(p.avg() - self.optimaldist) for p in self.ps]) def __str__(self): general = "Group: %d members, %d average error" % (self.persons, self.avg_error()) details = self.fmt % tuple([val for tup in [(p.angle, p.avg()) for p in self.ps] for val in tup]) return "\n".join((general, details)) # print("mean distance: %d == %d" % (36, mean([p.avg() for p in s]))) # for p in l: # print(p.angle, p.avg(howfar=1), p.avg(howfar=2), p.avg(howfar=3), p.avg(howfar=4), p.avg(howfar=5)) gr = Group(10) print(gr) # class Application(tk.Frame): # def __init__(self, master=None): # super().__init__(master) # self.pack() # self.create_widgets() # # def create_widgets(self): # self.hi_there = tk.Button(self) # self.hi_there["text"] = "Hello World\n(click me)" # self.hi_there["command"] = self.say_hi # self.hi_there.pack(side="top") # # self.quit = tk.Button(self, text="QUIT", fg="red", # command=root.destroy) # self.quit.pack(side="bottom") # # def say_hi(self): # print("hi there, everyone!") # # root = tk.Tk() # app = Application(master=root) # app.mainloop()