Как хранить случайные целые числа, сгенерированные из нескольких списков - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь написать скрипт, который имитирует игру в кости с нетрадиционными играми в кости.Цель игры - определить, какие кости лучше, основываясь на повторяющихся экспериментах, в которых побеждает большее число / бросок.Вот рабочий пример, который у меня есть:

from random import randint, seed
from datetime import datetime
import itertools as it
seed(datetime.now())


def find_the_best_dice(dices):
assert all(len(dice) == 6 for dice in dices)

for dice1, dice2 in it.combinations(dices, 2):

    num_rounds = 100
    num_dice1_wins = 0
    num_dice2_wins = 0

    for _ in range(num_rounds):
       dice1_result = dice1[randint(0, 5)]
       dice2_result = dice2[randint(0, 5)]

       if dice1_result > dice2_result:
          num_dice1_wins += 1
       elif dice2_result > dice1_result:
          num_dice2_wins += 1

     return ("index of winning dice or -1 if tie")
find_the_best_dice(dices=[[1, 1, 6, 6, 8, 8], [2, 2, 
4, 4, 9, 9], [3, 3, 5, 5, 7, 7]])

Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как сохранить количество выигрышей для более чем 2 кубиков.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Обычно я бы использовал словарь для чего-то подобного, но, поскольку ваше представление о кости - это список (не подлежащий изменению), вы можете преобразовать их в frozenset или tuple.Я предпочитаю кортеж, поскольку он сохраняет порядок и повторение (если есть).

num_rounds = 100
dice_wins = {tuple(x):0 for x in dices}
for dice1, dice2 in it.combinations(dices, 2):
    for _ in range(num_rounds):
        dice1_result = dice1[randint(0, 5)]
        dice2_result = dice2[randint(0, 5)]
        if dice1_result > dice2_result:
            dice_wins[tuple(dice1)] += 1
        elif dice2_result > dice1_result:
            dice_wins[tuple(dice2)] += 1
max_win = max(list(dice_wins.values()))
die_with_max_win = [dice for dice in dices if dice_wins[tuple(dice)] == max_win]

if len(die_with_max_win) == 1:
    return die_with_max_win[0] # only dice with that many wins
else:
    return -1 # more than one dice with max wins

Надеюсь, это поможет!

0 голосов
/ 10 октября 2018

Если вы говорите о кубиках с одинаковым количеством точек, «лучших» кубиков не существует.Например, если в среднем игральные кости A выигрывают от игры в кости B, а игральные кости B - от игры в кости C, все еще возможно, что в среднем игральные кости C выигрывают от игры в кости A.

...