加速风险战争游戏掷骰子模拟

2024-10-17 08:36:58 发布

您现在位置:Python中文网/ 问答频道 /正文

朋友们和我都在想,在棋盘游戏“风险”中,在不同的情况下,胜利的几率是多少,它涉及到一场世界大战,一块像地球一样的棋盘被分割成不同的领土。在

对于那些不熟悉风险的人:

在游戏的每一回合中,攻击者可以决定入侵棋盘上防守方的国家。攻击者和防御者选择战斗中使用多少骰子。例如,在某些情况下,攻击者可以决定用3个骰子攻击,而防御者可能选择用2个骰子进行防御。在

Attacker rolls 3 dice and gets 6,4,1
Defender rolls 2 dice and gets 6,3

If the same number is rolled, defender always wins, so in this situation,
 we compare the attacker's two highest rolls against the defender's.
The defender's 6 beats the attacker's 6 and
 the attacker's 4 beats the defender's 3.

在这种情况下,双方各损失一支军队。这可以继续更多的骰子掷骰子,直到攻击者停止攻击或耗尽军队,但在这一点上,我只对单掷骰子获胜的频率感兴趣。在

所以我写了一批来模拟很多次,而不是进入反直觉的概率世界。我对编码相当陌生,所以我在寻找关于效率的提示。我还没有深入研究多处理,所以如果可以的话,我们暂时不讨论这个问题。在

我很惊讶花了100万次模拟(大约20秒),我想知道是不是我做错了什么,或者这是你可能期望从这样的例行程序中得到的时间。在

以下是模拟部分:

^{pr2}$

Tags: andthe游戏棋盘情况骰子dice风险
3条回答

下面是1000000卷的numpy实现的开始。在

我已经标记了这个社区wiki如果有人想扩展它,请编辑。在

3个攻击骰子,2个防御骰子

import numpy
A = numpy.random.randint(1,6,size=(1000000,3)).sort()
D = numpy.random.randint(1,6,size=(1000000,2)).sort()
Ahigh = A[:,2]
Dhigh = D[:,2]
Awins1st = (Ahigh > Dhigh)
A2nd = A[:,1]
D2nd = D[:,1]
Awins2nd = (A2nd > D2nd)
# needed: tabulate results, remove smelly repeating code, generalize

Awins1stAwins2nd是1000000个元素的真/假数组,表示攻击者通过比较3个A骰子和2个D骰子赢得了第一次还是第二次“战斗”。在

因为您实际上是在对骰子列表进行排序,所以最好使用python的sort函数,它速度很快。在

生成随机数也相对较慢。通过只产生一个数字的所有骰子你可以加速它。在

如果attDice和defDice很小(<;=5),在我的计算机上运行大约5秒,可以进行一百万次掷骰。(使用PyPy,它可以在1s内运行。)

def freqs(attDice, defDice, rolls):
    m = min(attDice, defDice)
    freq = [0]*(m+1)
    for i in range(rolls):
        ar = random.randrange(6**attDice)
        dr = random.randrange(6**defDice)
        ad = [(ar / 6**j) % 6 for j in range(attDice)]
        ad.sort(reverse=True)
        dd = [(dr / 6**j) % 6 for j in range(defDice)]
        dd.sort(reverse=True)
        aws = sum(j > k for j, k in zip(ad, dd))
        freq[aws] += 1
    return freq

它返回攻击者获胜的频率表。在

很多随手的,完全不道德的回答。在

我一点也不惊讶100万发子弹能打20秒。我用Python做过类似的实验/模拟,也有同样的经验。当然,这些实验不是真正的时间关键,所以我没有优化。在

而Python并不以速度著称。也许你习惯了低级语言。如果你用Java做同样的实验,如果花这么长时间,我会很惊讶。在

(如果你真的想加快速度,也许你的问题中的一些背景会有所帮助?你的目的似乎很随意,所以除了一些持续的时间加速和一些微优化,我看没什么变化。)

相关问题 更多 >