智游城

标题: 用JAVA自己写一个赢率计算器, 遇到了一些问题, 请高手进! [打印本页]

作者: ticoarm    时间: 2015-5-28 14:48
标题: 用JAVA自己写一个赢率计算器, 遇到了一些问题, 请高手进!
最近想自己用java写一个类似pokerstove的赢率计算器, 思路还是穷举法, 数据结构和里面的算法都想好了, 但是遇到了一个问题, 就是算法的效率太慢了.
拿最简单的单挑, 一手牌对一手牌, 算赢率, 生成所有公共牌的组合, 也就是生成48取5的组合数, 我用的算法,在我还不错的电脑上跑了几分钟才跑完结果, 所以我想问一下, 关于这方面, 是我穷举法的思路不对, 还是有更优化的算法吗? 我用网上写好的赢率计算器, 在同样的电脑上, 不到一秒就出结果了...

作者: muyir    时间: 2015-5-28 15:11
建议这么来:
一手牌对另一手牌,这样的组合是有限的,不如事先算好保存好,到时候查询一下。这个理论最快
作者: yoking    时间: 2015-5-28 19:27
扑克学校出的Equilab计算时也分Enumerate all/Monte Carlo两种模式。但选Enumerate all时很快,Monte Carlo则很慢,估计是界面表达错误。

我没能力提供挑战算法的建议,自用的话,建个完整成手牌库是最笨重,又最有效率的方法。数据库结构和索引做得好,查询速度应该可以接受(尤其计算多人局、range vs. range时)。
作者: yoking    时间: 2015-5-28 19:28
扑克学校出的Equilab计算时也分Enumerate all/Monte Carlo两种模式。但选Enumerate all时很快,Monte Carlo则很慢,估计是界面表达错误。

我没能力提供挑战算法的建议,自用的话,建个完整成手牌库是最笨重,又最有效率的方法。数据库结构和索引做得好,查询速度应该可以接受(尤其计算多人局、range vs. range时)。
作者: Howard    时间: 2015-5-28 23:31
网上计算的很快,我认为是两种情况
一是Monte Carlo且指定模拟次数较少
二是Enumerate all但情况较简单,比如二人单挑,且给出flop,只有45 choose 2 = 990种可能

但即使Enumerate all,也不应该太慢,48choose5 也就才170来万种组合,一般的电脑应该秒出结果。为了测试,我让我电脑运行Monte Carlo,也是每秒钟可以计算两三百万个组合。应该是楼主算法有可改进之处。

另外穷举法只能用于很简单的情况,稍微一复杂,组合数就爆炸式增长,再快的电脑也得歇菜。
比如三人锅,两人有一定的range,另外一个随机牌,计算赢率
一个人 top 30%,另一个人top 20%,那么这个大约组合数是
1326*0.3 * 1225*0.2 * 1128* 46 choose 5 = 1.5e14

150万亿,恐怕得计算一整天才能遍历
作者: ticoarm    时间: 2015-5-29 01:18
感谢大家.

觉得网上的计算器也应该是提前算好赢率, 存入数据库, 然后用的时候调出来.

应该是存了一手牌对一手牌的赢率, 对于范围的话, 可能就是在一手牌的基础上再进行计算吧.
作者: 老陈    时间: 2015-5-30 12:04
要求精度不是很高, Monte Carlo算法完全能够满足。

作者: snowsnow    时间: 2015-5-30 18:22
请问那种计算机语言最容易?

作者: 老陈    时间: 2015-5-30 21:55
本帖最后由 老陈 于 2015-5-30 07:57 编辑
snowsnow 发表于 2015-5-30 04:22
请问那种计算机语言最容易?


我感觉Visual Basic不错,我在计算概率的帖子贴过几个程序。
我做苹果手机APP只能用Objective-C。

作者: snowsnow    时间: 2015-6-8 22:04
业余人士最好用 javascript, 连软件都不用装




欢迎光临 智游城 (http://zhiyoucheng.co/) Powered by Discuz! X3.2