朋友们和我都在想,在棋盘游戏“风险”中,在不同的情况下,胜利的几率是多少,它涉及到一场世界大战,一块像地球一样的棋盘被分割成不同的领土。在
对于那些不熟悉风险的人:
在游戏的每一回合中,攻击者可以决定入侵棋盘上防守方的国家。攻击者和防御者选择战斗中使用多少骰子。例如,在某些情况下,攻击者可以决定用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}$
下面是1000000卷的numpy实现的开始。在
我已经标记了这个社区wiki如果有人想扩展它,请编辑。在
3个攻击骰子,2个防御骰子
Awins1st
和Awins2nd
是1000000个元素的真/假数组,表示攻击者通过比较3个A骰子和2个D骰子赢得了第一次还是第二次“战斗”。在因为您实际上是在对骰子列表进行排序,所以最好使用python的sort函数,它速度很快。在
生成随机数也相对较慢。通过只产生一个数字的所有骰子你可以加速它。在
如果attDice和defDice很小(<;=5),在我的计算机上运行大约5秒,可以进行一百万次掷骰。(使用PyPy,它可以在1s内运行。)
它返回攻击者获胜的频率表。在
很多随手的,完全不道德的回答。在
我一点也不惊讶100万发子弹能打20秒。我用Python做过类似的实验/模拟,也有同样的经验。当然,这些实验不是真正的时间关键,所以我没有优化。在
而Python并不以速度著称。也许你习惯了低级语言。如果你用Java做同样的实验,如果花这么长时间,我会很惊讶。在
(如果你真的想加快速度,也许你的问题中的一些背景会有所帮助?你的目的似乎很随意,所以除了一些持续的时间加速和一些微优化,我看没什么变化。)
相关问题 更多 >
编程相关推荐