如果你曾经玩过冒险游戏,你很熟悉掷骰子来决定战斗的结果。如果没有,这里有一个简短的概要:
确定玩家可以摇多少骰子的规则如下:
决定掷骰子结果的规则如下:
如果攻击方或防御方只掷一个骰子,那么总共只损失一支军队;在其他所有情况下,总共损失两支军队。你知道吗
我想分析一下每对模辊的胜负频率。我可以循环所有的可能性,但我对使用ndarrays
和切片来进行计算感兴趣。你知道吗
例如,考虑攻击者掷一个骰子,防御者掷一个骰子的场景。我们可以在ndarray
中安排所有可能的结果。你知道吗
In [1]: import numpy as np
In [2]: x = np.tile(np.arange(1,7),(6,1))
In [3]: x
Out[3]:
array([[1, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 5, 6]])
如果防御者掷骰是列,攻击者掷骰是行,那么防御者获胜的区域就是这个数组的上三角部分
defence_win_region= array([[1, 1, 1, 1, 1, 1],
[0, 1, 1, 1, 1, 1],
[0, 0, 1, 1, 1, 1],
[0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1]])
如何从x
这样的数组中获得defence_win_region
这样的数组?为了分析2-1,3-1,3-2,1-2卷,如何将该方法扩展到更高维的数组?你知道吗
工作原理:
C((6,ad)) x C((6,dd))
的矩阵,所有组合按降序排列a_wins
中的值是攻击者获胜的次数,负数是防御获胜的次数。这包括无竞争的骰子。你知道吗nd_count
中的值是加权因子,等于组合在6**ad x 6**dd
组合矩阵中存在的次数有关2D阵列的具体问题的简短答案是:
但要进一步推动这一点,您需要除
tile
之外的工具。准备样本空间的自然方法是meshgrid
:现在
a
和d
是2d数组,包含攻击者和防御者的得分。与前面一样,np.where(a <= d, 1, 0)
生成一个1-0表(前一个表的转置,但这是选择的问题)。你知道吗让我们看看每个人掷两个骰子会发生什么:
这是防守队员第一轮获胜的地方(比较最高得分):
下面是最低分的比较,最低分是第二高分:
两者都是4D阵列,因为样本空间是四维的。你知道吗
当有人掷3个或更多骰子时,事情会变得更复杂,因为“第二高”的选择不像“最大”那样简单。可以通过堆叠玩家的骰子并沿新轴排序,然后切片来完成:
现在我们像以前一样比较:
相关问题 更多 >
编程相关推荐