java中使用几率_Java中使用蒙特卡洛算法计算德州扑克成牌概率(二)- 计算牌面分值...
德州撲克中比較重要的一個算法就是計(jì)算牌面的得分,不僅僅關(guān)乎概率計(jì)算的結(jié)果,同時也需要很高的性能。蒙特卡洛算法計(jì)算的次數(shù)越多結(jié)果越準(zhǔn)確,因此算法的性能至關(guān)重要。下面是一個高性能的牌面java計(jì)算算法。
參數(shù)介紹:
1)cards 需要計(jì)算分值的牌
2) nCards 需要計(jì)算牌的張數(shù)public?static?int?evaluate(long?cards,?int?nCards)?{
int?retval?=?0,?four_mask,?three_mask,?two_mask;
//本函數(shù)支持1-7張牌的計(jì)算
//按照牌色分開
int?sc?=?(int)?((cards?>>?(CLUB_OFFSET))?&?0x1fffL);
int?sd?=?(int)?((cards?>>?(DIAMOND_OFFSET))?&?0x1fffL);
int?sh?=?(int)?((cards?>>?(HEART_OFFSET))?&?0x1fffL);
int?ss?=?(int)?((cards?>>?(SPADE_OFFSET))?&?0x1fffL);
int?ranks?=?sc?|?sd?|?sh?|?ss;
int?n_ranks?=?nBitsTable[ranks];
int?n_dups?=?((int)?(nCards?-?n_ranks));
//檢查順子、同花、同花順并返回最佳牌面得分
if?(n_ranks?>=?5)?{
if?(nBitsTable[ss]?>=?5)?{
if?(straightTable[ss]?!=?0)
return?HANDTYPE_VALUE_STRAIGHTFLUSH?+?(int)?(straightTable[ss]?<
else
retval?=?HANDTYPE_VALUE_FLUSH?+?topFiveCardsTable[ss];
}?else?if?(nBitsTable[sc]?>=?5)?{
if?(straightTable[sc]?!=?0)
return?HANDTYPE_VALUE_STRAIGHTFLUSH?+?(int)?(straightTable[sc]?<
else
retval?=?HANDTYPE_VALUE_FLUSH?+?topFiveCardsTable[sc];
}?else?if?(nBitsTable[sd]?>=?5)?{
if?(straightTable[sd]?!=?0)
return?HANDTYPE_VALUE_STRAIGHTFLUSH?+?(int)?(straightTable[sd]?<
else
retval?=?HANDTYPE_VALUE_FLUSH?+?topFiveCardsTable[sd];
}?else?if?(nBitsTable[sh]?>=?5)?{
if?(straightTable[sh]?!=?0)
return?HANDTYPE_VALUE_STRAIGHTFLUSH?+?(int)?(straightTable[sh]?<
else
retval?=?HANDTYPE_VALUE_FLUSH?+?topFiveCardsTable[sh];
}?else?{
int?st?=?straightTable[ranks];
if?(st?!=?0)
retval?=?HANDTYPE_VALUE_STRAIGHT?+?(st?<
}
//如果沒有更好的牌(如:金剛、葫蘆)直接返回得分
if?(retval?!=?0?&&?n_dups?
return?retval;
}
//繼續(xù)檢查其他牌型
switch?(n_dups)?{?//相同牌的數(shù)量
case?0:
//高牌
return?HANDTYPE_VALUE_HIGHCARD?+?topFiveCardsTable[ranks];
case?1:?{
//一對
int?t,?kickers;
two_mask?=?ranks?^?(sc?^?sd?^?sh?^?ss);
retval?=?(int)?(HANDTYPE_VALUE_PAIR?+?(topCardTable[two_mask]?<
t?=?ranks?^?two_mask;
//計(jì)算對牌的分?jǐn)?shù)
kickers?=?(topFiveCardsTable[t]?>>?CARD_WIDTH)?&?~FIFTH_CARD_MASK;
retval?+=?kickers;
return?retval;
}
case?2:
//?2對或者三條
two_mask?=?ranks?^?(sc?^?sd?^?sh?^?ss);
if?(two_mask?!=?0)?{?//2對
int?t?=?ranks?^?two_mask;
retval?=?(int)?(HANDTYPE_VALUE_TWOPAIR
+?(topFiveCardsTable[two_mask]?&?(TOP_CARD_MASK?|?SECOND_CARD_MASK))?+?(topCardTable[t]?<
return?retval;
}?else?{?//三條
int?t,?second;
three_mask?=?((sc?&?sd)?|?(sh?&?ss))?&?((sc?&?sh)?|?(sd?&?ss));
retval?=?(int)?(HANDTYPE_VALUE_TRIPS?+?(topCardTable[three_mask]?<
t?=?ranks?^?three_mask;?/**?Only?one?bit?set?in?three_mask?*/
second?=?topCardTable[t];
retval?+=?(second?<
t?^=?(1?<
retval?+=?(int)?(topCardTable[t]?<
return?retval;
}
default:?//可能是葫蘆、金剛、順子、同花、或者2對
four_mask?=?sh?&?sd?&?sc?&?ss;
if?(four_mask?!=?0)?{?//金剛
int?tc?=?topCardTable[four_mask];
retval?=?(int)?(HANDTYPE_VALUE_FOUR_OF_A_KIND?+?(tc?<
^?(1?<
return?retval;
}
/**
*?Technically,?three_mask?as?defined?below?is?really?the?set?of?bits?which?are?set?in?three?or?four?of?the
*?suits,?but?since?we've?already?eliminated?quads,?this?is?OK
*/
/**
*?Similarly,?two_mask?is?really?two_or_four_mask,?but?since?we've?already?eliminated?quads,?we?can?use?this
*?shortcut
*/
two_mask?=?ranks?^?(sc?^?sd?^?sh?^?ss);
if?(nBitsTable[two_mask]?!=?n_dups)?{
//葫蘆
int?tc,?t;
three_mask?=?((sc?&?sd)?|?(sh?&?ss))?&?((sc?&?sh)?|?(sd?&?ss));
retval?=?HANDTYPE_VALUE_FULLHOUSE;
tc?=?topCardTable[three_mask];
retval?+=?(tc?<
t?=?(two_mask?|?three_mask)?^?(1?<
retval?+=?(int)?(topCardTable[t]?<
return?retval;
}
if?(retval?!=?0)?//?順子或同花
return?retval;
else?{
//?2對
int?top,?second;
retval?=?HANDTYPE_VALUE_TWOPAIR;
top?=?topCardTable[two_mask];
retval?+=?(top?<
second?=?topCardTable[two_mask?^?(1?<
retval?+=?(second?<
retval?+=?(int)?((topCardTable[ranks?^?(1?<
return?retval;
}
}
}
總結(jié)
以上是生活随笔為你收集整理的java中使用几率_Java中使用蒙特卡洛算法计算德州扑克成牌概率(二)- 计算牌面分值...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 课题申报书范文_课题优秀申报书 课题申报
- 下一篇: 安富莱DAC8653模块