from collections import deque, namedtuple Okenko = namedtuple('Okenko', 'prvni hranice druhy') def vyrob_tabulku(pravdepodobnosti): M = len(pravdepodobnosti) tabulka = [] dlouhe = deque([]) kratke = deque([]) def pridej_do_fronty(index, pravdepodobnost): # rozdělení podle délky intervalu: if pravdepodobnost < 1/M - 0.0001: # no, python pracovat s reálnými čísly moc přesně neumí... kratke.append((index, pravdepodobnost)) elif pravdepodobnost > 1/M + 0.0001: dlouhe.append((index, pravdepodobnost)) else: tabulka.append(Okenko(prvni=i, hranice=0, druhy=i)) # přidáme všechno do front for i in range(M): pridej_do_fronty(i, pravdepodobnosti[i]) while len(tabulka) != M: # vezmu krátký interval a doplním částí dlouhého prvni, hranice = kratke.popleft() druhy, delka_druheho = dlouhe.popleft() tabulka.append(Okenko(prvni=prvni, hranice=hranice, druhy=druhy)) # zbytek vrátíme do fronty pridej_do_fronty(druhy, delka_druheho - hranice) assert(len(dlouhe) == 0) assert(len(kratke) == 0) return tabulka def vyhledat(tabulka, vygenerovane_cislo): M = len(tabulka) index_v_tabulce = int(vygenerovane_cislo * M) okenko = tabulka[index_v_tabulce] zbytek = (vygenerovane_cislo * M) - index_v_tabulce if zbytek > okenko.hranice: return okenko.druhy else: return okenko.prvni # zadaný vstup: pravdepodobnosti = [ 1/6, 1/3, 1/2 ] tabulka = vyrob_tabulku(pravdepodobnosti) print(tabulka) while True: # generovaná čísla očekáváme na vstupu cislo = float(input()) print(vyhledat(tabulka, cislo))