用JAVA自己写一个赢率计算器, 遇到了一些问题, 请高手进!
最近想自己用java写一个类似pokerstove的赢率计算器, 思路还是穷举法, 数据结构和里面的算法都想好了, 但是遇到了一个问题, 就是算法的效率太慢了.拿最简单的单挑, 一手牌对一手牌, 算赢率, 生成所有公共牌的组合, 也就是生成48取5的组合数, 我用的算法,在我还不错的电脑上跑了几分钟才跑完结果, 所以我想问一下, 关于这方面, 是我穷举法的思路不对, 还是有更优化的算法吗? 我用网上写好的赢率计算器, 在同样的电脑上, 不到一秒就出结果了...static/image/smiley/default/sweat.gif建议这么来:一手牌对另一手牌,这样的组合是有限的,不如事先算好保存好,到时候查询一下。这个理论最快 扑克学校出的Equilab计算时也分Enumerate all/Monte Carlo两种模式。但选Enumerate all时很快,Monte Carlo则很慢,估计是界面表达错误。我没能力提供挑战算法的建议,自用的话,建个完整成手牌库是最笨重,又最有效率的方法。数据库结构和索引做得好,查询速度应该可以接受(尤其计算多人局、range vs. range时)。 扑克学校出的Equilab计算时也分Enumerate all/Monte Carlo两种模式。但选Enumerate all时很快,Monte Carlo则很慢,估计是界面表达错误。我没能力提供挑战算法的建议,自用的话,建个完整成手牌库是最笨重,又最有效率的方法。数据库结构和索引做得好,查询速度应该可以接受(尤其计算多人局、range vs. range时)。 网上计算的很快,我认为是两种情况一是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.5e14150万亿,恐怕得计算一整天才能遍历 感谢大家.觉得网上的计算器也应该是提前算好赢率, 存入数据库, 然后用的时候调出来.应该是存了一手牌对一手牌的赢率, 对于范围的话, 可能就是在一手牌的基础上再进行计算吧. 要求精度不是很高, Monte Carlo算法完全能够满足。 请问那种计算机语言最容易? snowsnow 发表于 2015-5-30 04:22请问那种计算机语言最容易?我感觉Visual Basic不错,我在计算概率的帖子贴过几个程序。我做苹果手机APP只能用Objective-C。 业余人士最好用 javascript, 连软件都不用装
頁:
[1]