2012-03-10 3 views
0

Я пытаюсь изучить библиотеку Python itertools, и я подумал, что хорошим тестом будет симуляция рулонов кости. Легко сгенерировать все возможные рулоны, используя product и подсчитывая количество возможных способов сделать это с помощью библиотеки collections. Я пытаюсь решить проблему, возникающую в играх, таких как Monopoly: когда удваиваются качки, вы снова катитесь, и ваша итоговая сумма является суммой двух рулонов.itertools кубики рулонов: удваивает рулон дважды

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

Я ищу гладкий способ решения (путем перечисления) проблемы с броском кубика с удвоениями с использованием itertools и коллекций.

import numpy as np 
from collections import Counter 
from itertools import * 

die_n = 2 
max_num = 6 

die = np.arange(1,max_num+1) 
C0,C1 = Counter(), Counter() 

for roll in product(die,repeat=die_n): 
    if len(set(roll)) > 1: C0[sum(roll)] += 1 
    else: C1[sum(roll)] += 1 
+0

Не могли бы вы сформулировать проблему немного более формально? –

+0

@KarlKnechtel Перечислять, используя библиотеки itertools и коллекции, ненормированное распределение вероятности, которое возникает, когда свернуты строки 'n' с номерами от 1 до' m'. Функция, подлежащая подсчету, представляет собой сумму 'n', за исключением случаев, когда все кости совпадают. Если все кости совпадают по первому рулону, то подсчитывается количество суммы первого броска и второго рулона. Неважно, совпадают ли они во втором броске. Буквы с двумя кубиками, пронумерованные 1..6: '[3,4], [2,1], [[4,4], [6,2]]", дающие итоговые значения '[7,3, 16] '. – Hooked

+0

Вы можете решить эту проблему в моделировании стиля Монте-Карло. Если вы думаете об этой проблеме в древовидном представлении: начните с root, прокрутите один раз к детям с глубиной = 1, из которых только ребенок с удвоениями имеет поддерево более глубоких детей той же структуры. Это означает, что дети с двойным роллингом обращаются к корню. Теперь у вас хорошая структура и вы можете делать случайные рендеринги, начиная с root, чтобы оценить вероятность события. – Mai

ответ

1

Оставляя numpy здесь ради простоты:

Во-первых, создать все рулоны, будь то одиночные или двойные валки:

from itertools import product 
from collections import Counter 

def enumerate_rolls(die_n=2, max_num=6): 
    for roll in product(range(1, max_num + 1), repeat=die_n): 
     if len(set(roll)) != 1: 
      yield roll 
     else: 
      for second_roll in product(range(1, max_num + 1), repeat=die_n): 
       yield roll + second_roll 

Теперь несколько тестов:

print(len(list(enumerate_rolls()))) # 36 + 6 * 36 - 6 = 246 
A = list(enumerate_rolls(5, 4)) 
print(len(A)) # 4 ** 5 + 4 * 4 ** 5 - 4 = 5116 
print(A[1020:1030]) # some double rolls (of five dice each!) and some single rolls 

и результат:

246 
5116 
[(1, 1, 1, 1, 1, 4, 4, 4, 4, 1), (1, 1, 1, 1, 1, 4, 4, 4, 4, 2), (1, 1, 1, 1, 1, 4, 4, 4, 4, 3), (1, 1, 1, 1, 1, 4, 4, 4, 4, 4), (1, 1, 1, 1, 2), (1, 1, 1, 1, 3), (1, 1, 1, 1, 4), (1, 1, 1, 2, 1), (1, 1, 1, 2, 2), (1, 1, 1, 2, 3)] 

Чтобы получить итоговые данные использовать специальные Counter возможности:

def total_counts(die_n=2, max_num=6): 
    return Counter(map(sum, enumerate_rolls(die_n, max_num))) 

print(total_counts()) 
print(total_counts(5, 4)) 

Результаты:

Counter({11: 18, 13: 18, 14: 18, 15: 18, 12: 17, 16: 17, 9: 16, 10: 16, 17: 16, 18: 14, 8: 13, 7: 12, 19: 12, 20: 9, 6: 8, 5: 6, 21: 6, 22: 4, 4: 3, 3: 2, 23: 2, 24: 1}) 
Counter({16: 205, 17: 205, 18: 205, 19: 205, 21: 205, 22: 205, 23: 205, 24: 205, 26: 205, 27: 205, 28: 205, 29: 205, 25: 204, 20: 203, 30: 203, 15: 202, 14: 200, 31: 200, 13: 190, 32: 190, 12: 170, 33: 170, 11: 140, 34: 140, 35: 102, 10: 101, 9: 65, 36: 65, 8: 35, 37: 35, 7: 15, 38: 15, 6: 5, 39: 5, 40: 1}) 

Примечание: На данный момент не существует никакого способа вычисления вероятности итоги. Вы должны знать, если это двойной рулон или общий рулон для взвешивания правильно.

Смежные вопросы