上篇文章说了如何实现完全随机的洗牌,接着德州的话题,我们再说说,当牌局打到了Flop,最终得到各个牌型的概率是多少。
所谓Flop,即公共牌发出了三张。英文Flop有滑铁卢的含义,我觉得英文术语中把三张公共牌打出来称作Flop,有点意思。就好像你底牌捏着对A,结果三张公共牌打出来后,人家快凑成了顺子,优势牌变成劣势牌。这种情况在德州实在太常见了,也是德州的魅力之一。
闲话就不多说了,大家可以点击链接,看一看不同底牌和三张公共牌的情况下,拿到不同牌型的概率都有多少。对概率有个更清晰的了解,或许对自己的出牌策略会有帮助。当然,所谓策略,上升到博弈论的东西,就不展开说了。毕竟每个人的风险偏好都不一样。

再说些代码实现方面枯燥的事儿,不敢兴趣的就跳过吧。
这次实现的概率计算用的非常自然的思路,即遍历所有可能出现七张牌。确定七张牌中的五张牌,七张牌即存在C(47,2)种可能,即47!/(45!*2!)种。而对于每种可能,确定它的最大牌型,又是一个C(7,5),即7!/(5!2!)次的计算。所以,一次完整的概率计算,计算量为对1081种七张牌组合计算其最大牌型,每个七张牌组合,需遍历21次以确定其最大牌型。但此算法,与对108121=22701种五张牌组合确计算其最大牌型并不是完全等同的概念。
当然,应该有更轻量级的算法。此处我没有细想。以目前算法,确定七张牌中的五张牌的情况下计算概率,在浏览器中需要几秒的计算时间,并非一个特别高效的算法。node.js可以通过开启更多线程来提升计算速率,但我们知道,在浏览器中,一个标签页只能拥有一个线程。
所以,若想在只知道自己两张底牌的情况下去计算概率,虽然也是一件比较有意义的事情,就不太适合这种算法去做计算。node.js单线程大概需要几十分钟,浏览器只会更久。使用纯数学的方法去计算概率,应该更为适用。