首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找到二维数组满足某些条件的位置?

如何找到二维数组满足某些条件的位置?
EN

Stack Overflow用户
提问于 2016-12-11 21:30:08
回答 1查看 170关注 0票数 2

背景

如果你曾经冒险过,你很熟悉掷骰子来决定一场战役的结果。如果没有,这里有一个简短的概要:

确定一个玩家可以摇几个骰子的规则如下:

  1. 攻击者的死亡人数可能比他的国家的军队少一人,最多三人。
  2. 防御者可以和他的国家军队的数量一样多的掷骰子,最多两次。

决定某一掷骰子结果的规则如下:

  1. 将最高的攻击者死亡与最高的防御死亡进行比较。人数少的人会失去一支军队。打领带给防守者。
  2. 第二高的骰子会重复这个步骤。

无论是攻击者还是防守者都只有一次死亡,总共只有一支军队会输掉;在所有其他情况下,总共会有两支军队输掉。

我想分析一下每对模具辊的得失频率。我可以循环所有的可能性,但我感兴趣的是使用ndarrays和切片来进行计算。

例如,考虑攻击者滚动一次死亡和防御方滚动一次死亡的场景。我们可以在ndarray中安排所有可能的结果。

代码语言:javascript
复制
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]])

如果防御者滚动是列,攻击者滚动是行,那么防御者获胜的区域是这个数组的上三角部分。

代码语言:javascript
复制
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]])

问题

如何从像defence_win_region这样的数组中获得像x这样的数组?如何将该方法扩展到更高维度的数组,以便分析2-1,3-1,3-2,1-2卷?

EN

回答 1

Stack Overflow用户

发布于 2016-12-12 08:58:51

代码语言:javascript
复制
import numpy as np
import scipy
import itertools

def riskRoll(ad,dd):  #Never gonna give you up . . . 
    minD=min(ad,dd)
    a=np.array(list(itertools.combinations_with_replacement(
        np.arange(6,0,-1),ad)))
    d=np.array(list(itertools.combinations_with_replacement(
        np.arange(6,0,-1),dd)))
    na=np.array([scipy.misc.factorial(ad)/np.prod(
        scipy.misc.factorial(np.unique(roll,return_counts=True)[1])) for roll in a])
    nd=np.array([scipy.misc.factorial(dd)/np.prod(
        scipy.misc.factorial(np.unique(roll,return_counts=True)[1])) for roll in d])
    a_wins= np.sum(p.where(a[None,:,0:minD]>d[:,None,0:minD],1,-1), axis=-1)+ad-dd
    nd_count=na[:,None]*nd[None,:]
    return a_wins*nd_count

它的工作原理:

  1. 输出是大小为C((6,ad)) x C((6,dd))的矩阵,所有组合按降序排列。
  2. 矩阵a_wins中的值是攻击者获胜的次数,负数是防御胜利。这包括无争议的骰子。
  3. nd_count中的值是加权因子,等于组合在6**ad x 6**dd组合矩阵中存在的次数。
  4. 最终输出是两者的乘积,显示按发生加权的胜数。求和,除以6**(ad+dd),以获得预期的得失
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41091349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档