#扑克 #查找表 #蒙特卡洛 #权益

bin+lib poker_eval

德州扑克手牌权益评估器

1 个不稳定版本

0.1.0 2024 年 2 月 5 日

#312游戏


用于 poker_server

MIT 许可证

85KB
2K SLoC

扑克手牌评估器

此软件包包含快速的 德州扑克 手牌权益评估器。

52 张牌中的每张牌都赋予一个整数键。
最低的9位编码牌的花色,其余的23位编码牌的面值。

这种编码,基于软件包 poker_keygen 预先计算出的键,使得可以通过一些简单的操作(求和、位掩码、位移动和表查找)唯一地识别手牌等级。

若要将此软件包用作服务器,请参阅 poker_server

评估

查找表的构建按顺序进行

5 张牌的手牌

构建 5 张牌的查找表:five::build_tables
这使函数 get_rank_five 成为可能。

use poker_eval::eval::five::{build_tables, get_rank_five};

// precalculate lookup tables
let t5 = build_tables(false);

// run the evaluation multiple times
let rank = get_rank_five(&t5, [31, 26, 50, 16, 49]);
assert_eq!(rank, 3971)

7 张牌的手牌

构建 7 张牌的查找表:使用函数 eval:7️⃣:get_rank_seven,该函数基于 eval:5️⃣:get_rank_five 构建:seven::build_tables
这使函数 get_rank 成为可能。
此函数是评估玩家手牌的入口点。

use poker_eval::eval::seven::{build_tables, get_rank};

// precalculate lookup tables
let arc_t7 = build_tables(false);

// run the evaluation multiple times
let rank = get_rank(&arc_t7, [5, 4, 18, 31, 34, 48, 22]);
assert_eq!(rank, 1689)

计算

从函数 get_rank 中,实现了两个计算函数

  • 确定性,即穷举的
  • 蒙特卡洛

确定性

函数 calc_equity_det

  • 通过穷举模拟计算所有玩家手牌的权益。
  • 这需要知道所有玩家的牌。
  • 这是可行的,因为在所有情况下,模拟的次数都很小 - 且评估器快速。
use poker_eval::eval::seven::build_tables;
use poker_eval::calc::equity_det::calc_equity_det;

// precalculate lookup tables
let arc_t7 = build_tables(true);

// then you can call calc_equity_det multiple times
let equity = calc_equity_det(
    // clone of Arc<TableSeven>
    arc_t7.clone(),  
    // players cards  
    vec![[7, 8], [22, 27]],  
    // table cards  
    vec![51, 30, 41],  
    // verbose  
    true
);
println!("equity = {:?}", equity);
//Ok([[0.23131312, 0.10707071], [0.55454546, 0.10707071]])

蒙特卡洛

函数 calc_equity_mc

  • 通过蒙特卡洛模拟计算第一位玩家的权益。
  • 这不需要知道所有玩家的信息。
  • 因为情况的数量可能很大,必须指定一定数量的模拟。
use poker_eval::eval::seven::build_tables;
use poker_eval::calc::equity_mc::calc_equity_monte_carlo;

// precalculate lookup tables
let arc_t7 = build_tables(true);

// then you can call calc_equity_monte_carlo multiple times
let equity = calc_equity_monte_carlo(
    // clone of Arc<TableSeven>
    arc_t7.clone(),
    // player cards
    vec![vec![8, 9], vec![11, 28], vec![]],
    // table cards
    vec![15, 47, 23, 33],
    // number of game
    100_000_000,
);
println!("equity = {:?}", equity);
// Ok(HandEquity { win: 0.3167, tie: 0.0 })

依赖

~0.9–1.5MB
~34K SLoC