如何使用变量和滚动方法比较 2 个骰子 5782 次的结果

问题描述 投票:0回答:1

如何编码:

玩家1总是掷骰子A,玩家B总是掷骰子B,比较结果5782次?也分别适用于 A vs C、B vs C。

看来我无法打印出骰子A较大,骰子B较大,然后骰子A和B具有相等值的次数。

问题是,显然,die_A_larger、die_B_larger 和 die_A_and_B_equal 是未定义的。我想知道为什么以及如何解决这个问题。

到目前为止我的代码:

import numpy as np

class die:
    def __init__(self, side_values=[1,2,3,4,5,6]):
        self.side_values = side_values

    def roll(self):
        i=np.random.randint(1,7)
        return self.sides[i]

#variables
A = die([3,3,3,3,3,6])
B = die([2,2,2,5,5,5])
C = die([1,4,4,4,4,4])
nmax = 5782

def count_number_of_wins(A, B):

    die_A_larger = 0
    die_B_larger = 0
    die_A_and_B_equal = 0

for n in range(nmax):
    if A > B:
        die_A_larger += 1
    elif A < B:
        die_B_larger +=1
    else:
        die_A_and_B_equal +=1
    
    return (die_A_larger, die_B_larger, die_A_and_B_equal)
print (count_number_of_wins(A, B))


def determine_best_die(dice):
    assert all(len(die) == 6 for die in dice)

    wins = [0] * len(dice)

    for i in range(len(dice)):
        for j in range(i+1, len(dice)):
            a, b = count_number_of_wins(dice[i], dice[j])
            if a > b:
                wins[i] = wins[i] + 1
            else:
                wins[j] = wins[j] + 1
    for i in wins:
        if (i == (len(dice)-1)):
            return wins.index(i)
    return -1
python python-3.x matplotlib compare dice
1个回答
0
投票

您需要向量化,并通过

itertools
迭代您在问题中描述的组合:

import itertools
from typing import Sequence

import numpy as np


class Die:
    def __init__(self, side_values: Sequence[int] = range(1, 7)) -> None:
        self.sides, counts = np.unique(side_values, return_counts=True)
        self.probabilities = counts / counts.sum()

    def roll(self, rand: np.random.Generator, n: int) -> np.ndarray:
        return rand.choice(a=self.sides, p=self.probabilities, size=n)


def main() -> None:
    rand = np.random.default_rng(seed=0)
    a = Die((3, 3, 3, 3, 3, 6))
    b = Die((2, 2, 2, 5, 5, 5))
    c = Die((1, 4, 4, 4, 4, 4))
    nmax = 5_782
    names = 'abc'

    for (name_1, die_1), (name_2, die_2) in itertools.combinations(
        zip(names, (a, b, c)), r=2,
    ):
        rolls_1 = die_1.roll(rand, n=nmax)
        rolls_2 = die_2.roll(rand, n=nmax)
        print(f'{name_1} < {name_2}: {np.count_nonzero(rolls_1 < rolls_2)}')
        print(f'{name_1} = {name_2}: {np.count_nonzero(rolls_1 == rolls_2)}')
        print(f'{name_1} > {name_2}: {np.count_nonzero(rolls_1 > rolls_2)}')


if __name__ == '__main__':
    main()
a < b: 2409
a = b: 0
a > b: 3373
a < c: 4029
a = c: 0
a > c: 1753
b < c: 2402
b = c: 0
b > c: 3380
© www.soinside.com 2019 - 2024. All rights reserved.