# Poprawione, z możliwością zmiany ilości kart bez edytowania kodu, zapytanie przy uruchamianiu programu # W celu analizay własnej, skopiuj wyniki programu do kolumny w excelu i stwórz wykres punktowy z tymi danymi import random as rand import pprint pp = pprint.PrettyPrinter(indent=4, width=60, compact=True) def generate_card_stack(s, r, ordered): if ordered: card_stack = list(range(1, s+1)) else: card_stack = rand.sample(range(1,r+1),s) return card_stack def get_average_from_list(lst): return sum(lst) / len(lst) def get_average_distanses(stack): distanses = [] for num, card in enumerate(stack[:-1]): distanses.append(abs(stack[num+1]-card)) return get_average_from_list(distanses) def check_entropy(stack, s, r): rand_stack = generate_card_stack(s, r, False) d = get_average_distanses(rand_stack) ds = get_average_distanses(stack) return abs(ds-d) def divide_for_small_stacks(stack, qtty): small_stacks = [[] for i in range(0,qtty)] for num, card in enumerate(stack): small_stacks[num%qtty].append(card) return small_stacks def get_random_stack(stck, stack_qtty): r = rand.randint(0, stack_qtty)%len(stck) s = stck[r] return [s, r] def stack_on_stack(stacks, stack_qtty): while True: stcks = stacks s = get_random_stack(stcks, stack_qtty) first_stack = s[0] r = s[1] if len(stcks)>1: stcks.pop(r) s = get_random_stack(stcks, stack_qtty) second_stack = s[0] r = s[1] stcks[r] = second_stack + first_stack else: break return stcks def shuffle(s, r, stack_qtty, stack): stacks = divide_for_small_stacks(stack, stack_qtty) stacks = stack_on_stack(stacks, stack_qtty) return stacks[0] def main(): simulation = 1000 rounds = 1 stack_decrease = 0 stack_qtty = 1 s = int(input('Cards in deck ')) r = s # card types rounds = int(input('Rounds: ')) stack_qtty = int(input('Stack quantity: ')) print('') control_entropy = [] shuffle_entropy = [] rand_entropy = [] stack = generate_card_stack(s, r, True) ord_stack = generate_card_stack(s, r, True) while simulation>0: stack = generate_card_stack(s, r, True) while rounds>0: shuffled_stack = shuffle(s, r, stack_qtty, stack) stack = shuffled_stack rounds-=1 control_entropy.append(check_entropy(ord_stack, s, r)) shuffle_entropy.append(check_entropy(shuffled_stack, s, r)) rand_stack = generate_card_stack(s, r, False) rand_entropy.append(check_entropy(rand_stack, s, r)) simulation -=1 #pp.pprint(rand_stack) #print() #pp.pprint(shuffled_stack) for s in shuffled_stack: print(s) #for ra in rand_stack: # print(ra) #pp.pprint(shuffled_stack) pp.pprint(rand_stack) print("ordered vs random: ", get_average_from_list(control_entropy)) print("shuffled vs random: ", get_average_from_list(shuffle_entropy)) print("random vs random: ", get_average_from_list(rand_entropy)) #print("shuffled vs random max: ", max(shuffle_entropy)) #print("shuffled vs random min: ", min(shuffle_entropy)) main()