3

假设赌场 (C) 的游戏只涉及一名玩家和一名庄家。该游戏使用 m+n 牌进行,m 标记为获胜牌,“n”标记为输牌。

游戏规则/信息:

  1. 玩家知道每个阶段的赢牌数量“m”和输牌数量“n”。
  2. 玩家开始玩“X”数量并玩到所有牌都被抽出。
  3. 庄家非常聪明,有能力根据玩家在桌上的赌注来抽一张赢牌或输牌。
  4. 每次抽奖都会减少任一类别的牌张数,即如果抽出中奖牌,则中奖牌数变为“m-1”,反之亦然。
  5. 玩家也可以投注“0”金额。
  6. 如果玩家下注“W”金额并抽出一张获胜牌。玩家获得 2W 作为回报,否则他失去下注金额

    问题:推导出玩家应该遵循的算法或策略以最大化他的利润。

一些例子 :

测试用例 - 1:

Lets say m=0, n=1

玩家知道庄家没有机会,只能让他输掉任何他下注的赌注,所以他下注“0”金额。因此,他能做的最大值是 X。

测试用例 - 2:

m=1, n=0

玩家知道庄家别无选择,只能抽出唯一的牌,即获胜的牌,因此他下注所有的赌注,即“X”并取回“2X”。因此,他以 2 倍的金额退出赌场。

测试用例 - 3:

m=1, n=1 : 

假设玩家下注“W”金额 - 假设庄家抽奖牌:所以净金额 = X+W 和 m->0 和 n->1 :因此在这种情况下最大金额 X+W -如果庄家抽出失败牌:所以剩下的净额 = XW 和 m->1 和 n->0 :因此,在这种情况下,最大数量为 2(XW)

玩家将选择'W'来最大化他的利润,这只能在 2(XW)=X+W => W=X/3 的情况下完成

因此,在这种情况下玩家可以走出的最大数量 = 4X/3

4

1 回答 1

1

这是来自 F# 的解决方案

建议:除非必须,否则不要进行符号编程。在这种情况下,我们假设 X = 1

let stake = Array2D.zeroCreate 100 100
let bankroll =  Array2D.zeroCreate 100 100

for i in 1 .. 99 do
    stake.[0, i] <- 0.0
    bankroll.[0, i] <- 1.0

for i in 1 .. 99 do
    stake.[i, 0] <- 1.0
    bankroll.[i, 0] <- 2.0

stake.[0, 0] <- 0.0
bankroll.[0, 0] <- 1.0

let rec solve i j =
    if bankroll.[i, j] <> 0.0 then (stake.[i, j], bankroll.[i, j])
    else
       let a = snd (solve (i - 1) j)
       let b = snd (solve i (j - 1))
       let x = (b - a) / (a + b)  // solve (1 + x)a = (1 - x)b
       let y = (x + 1.0) * a
       stake.[i, j] <- x
       bankroll.[i, j] <- y
       (x, y)

solve 10 10 // = (0.06182352702, 1.333333333)

似乎只要赢牌的数量等于输牌的数量,玩家可以获得的最大利润总是4X/3

于 2012-12-16T13:28:02.867 回答