0

私はPythonライブラリを学ぼうとしてitertoolsいますが、サイコロを振るシミュレーションが良いテストになると思いました。ライブラリを使用して可能なすべてのロールを生成しproduct、その方法の数を数えるのは簡単です。collections私はモノポリーのようなゲームで発生する問題を解決しようとしています。ダブルスがロールされると、あなたは再びロールし、最終的な合計は2つのロールの合計になります。

以下は、問題を解決するための私の最初の試みです。2つのカウンター、1つはダブル用、もう1つはダブル以外用です。それらを組み合わせる良い方法があるのか​​、それとも2つのカウンターがそれを行う最良の方法であるのかはわかりません。

itertoolsとコレクションを使用して、doubleでサイコロを振る問題を(列挙によって)解決するための巧妙な方法を探しています。

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
4

1 に答える 1

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})

注:現時点では、合計の確率を計算する方法はありません。正しく計量するには、それがダブルロールなのかトータルロールなのかを知る必要があります。

于 2012-03-11T22:48:30.763 に答える