- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
问题
有没有可以保持的最佳值(value),这样我才能赢得尽可能多的比赛?如果是这样,那是什么?
编辑:是否可以为给定的限制计算出确切的获胜概率,而与对手的所作所为无关? (自大学以来,我还没有做过概率和统计)。我有兴趣将其作为与模拟结果进行对比的答案。
编辑:修复了我算法中的错误,更新了结果表。
背景
我一直在玩改进的二十一点游戏,其中对标准规则进行了一些相当烦人的规则调整。我已将与标准二十一点规则不同的规则斜体化,并为不熟悉的人添加了二十一点规则。
修改二十一点规则
2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A
CARDS = ((2..11).to_a+[10]*3)*4
#!/usr/bin/env ruby
class Array
def shuffle
sort_by { rand }
end
def shuffle!
self.replace shuffle
end
def score
sort.each_with_index.inject(0){|s,(c,i)|
s+c > 21 - (size - (i + 1)) && c==11 ? s+1 : s+c
}
end
end
N=(ARGV[0]||100_000).to_i
NDECKS = (ARGV[1]||1).to_i
CARDS = ((2..11).to_a+[10]*3)*4*NDECKS
CARDS.shuffle
my_limits = (12..21).to_a
opp_limits = my_limits.dup
puts " " * 55 + "opponent_limit"
printf "my_limit |"
opp_limits.each do |result|
printf "%10s", result.to_s
end
printf "%10s", "net"
puts
printf "-" * 8 + " |"
print " " + "-" * 8
opp_limits.each do |result|
print " " + "-" * 8
end
puts
win_totals = Array.new(10)
win_totals.map! { Array.new(10) }
my_limits.each do |my_limit|
printf "%8s |", my_limit
$stdout.flush
opp_limits.each do |opp_limit|
if my_limit == opp_limit # will be a tie, skip
win_totals[my_limit-12][opp_limit-12] = 0
print " --"
$stdout.flush
next
elsif win_totals[my_limit-12][opp_limit-12] # if previously calculated, print
printf "%10d", win_totals[my_limit-12][opp_limit-12]
$stdout.flush
next
end
win = 0
lose = 0
draw = 0
N.times {
cards = CARDS.dup.shuffle
my_hand = [cards.pop, cards.pop]
opp_hand = [cards.pop, cards.pop]
# hit until I hit limit
while my_hand.score < my_limit
my_hand << cards.pop
end
# hit until opponent hits limit
while opp_hand.score < opp_limit
opp_hand << cards.pop
end
my_score = my_hand.score
opp_score = opp_hand.score
my_score = 0 if my_score > 21
opp_score = 0 if opp_score > 21
if my_hand.score == opp_hand.score
draw += 1
elsif my_score > opp_score
win += 1
else
lose += 1
end
}
win_totals[my_limit-12][opp_limit-12] = win-lose
win_totals[opp_limit-12][my_limit-12] = lose-win # shortcut for the inverse
printf "%10d", win-lose
$stdout.flush
end
printf "%10d", win_totals[my_limit-12].inject(:+)
puts
end
ruby blackjack.rb [num_iterations] [num_decks]
opponent_limit
my_limit | 12 13 14 15 16 17 18 19 20 21 net
-------- | -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- --------
12 | -- -7666 -13315 -15799 -15586 -10445 -2299 12176 30365 65631 43062
13 | 7666 -- -6962 -11015 -11350 -8925 -975 10111 27924 60037 66511
14 | 13315 6962 -- -6505 -9210 -7364 -2541 8862 23909 54596 82024
15 | 15799 11015 6505 -- -5666 -6849 -4281 4899 17798 45773 84993
16 | 15586 11350 9210 5666 -- -6149 -5207 546 11294 35196 77492
17 | 10445 8925 7364 6849 6149 -- -7790 -5317 2576 23443 52644
18 | 2299 975 2541 4281 5207 7790 -- -11848 -7123 8238 12360
19 | -12176 -10111 -8862 -4899 -546 5317 11848 -- -18848 -8413 -46690
20 | -30365 -27924 -23909 -17798 -11294 -2576 7123 18848 -- -28631 -116526
21 | -65631 -60037 -54596 -45773 -35196 -23443 -8238 8413 28631 -- -255870
最佳答案
我对您的结果表示怀疑。例如,如果对手的目标是19,则您的数据表明,击败他的最佳方法是击中直到您达到20。这没有通过基本的气味测试。您确定没有错误吗?如果我的对手力争达到19或更高,我的策略将是不惜一切代价避免破产:停留在13或更高的水平上(甚至是12?)。排在20位是错误的-不仅只是很小的一部分,而且很多。
我怎么知道您的数据不正确?因为您正在玩的二十一点游戏并不罕见。这是庄家在大多数赌场中的游戏方式:庄家击中目标然后停下,无论其他玩家所握持的是什么。这个目标是什么?站在硬杆17上,然后按软杆17。当您摆脱脚本中的错误时,它应该确认赌场知道他们的生意。
当我对您的代码进行以下替换时:
# Replace scoring method.
def score
s = inject(0) { |sum, c| sum + c }
return s if s < 21
n_aces = find_all { |c| c == 11 }.size
while s > 21 and n_aces > 0
s -= 10
n_aces -= 1
end
return s
end
# Replace section of code determining hand outcome.
my_score = my_hand.score
opp_score = opp_hand.score
my_score = 0 if my_score > 21
opp_score = 0 if opp_score > 21
if my_score == opp_score
draw += 1
elsif my_score > opp_score
win += 1
else
lose += 1
end
n=10000
opponent_limit
my_limit | 12 13 14 15 16 17 18 19 20 21 net
-------- | -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- --------
12 | -- -843 -1271 -1380 -1503 -1148 -137 1234 3113 6572
13 | 843 -- -642 -1041 -1141 -770 -93 1137 2933 6324
14 | 1271 642 -- -498 -784 -662 93 1097 2977 5945
15 | 1380 1041 498 -- -454 -242 -100 898 2573 5424
16 | 1503 1141 784 454 -- -174 69 928 2146 4895
17 | 1148 770 662 242 174 -- 38 631 1920 4404
18 | 137 93 -93 100 -69 -38 -- 489 1344 3650
19 | -1234 -1137 -1097 -898 -928 -631 -489 -- 735 2560
20 | -3113 -2933 -2977 -2573 -2146 -1920 -1344 -735 -- 1443
21 | -6572 -6324 -5945 -5424 -4895 -4404 -3650 -2560 -1443 --
关于ruby - 此修改后的二十一点游戏的最佳获胜策略是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2301460/
我正在开发一个 CMD 批次。我想在里面做一些数学运算。这个公式:(x+1)100:y 所以批量处理,x = %x%, and y = %y% .我知道如何设置变量。现在,如何批量计算这个? (WIN
我正在使用 Electron 制作桌面应用程序,我制作了自己的最小化最大化和关闭按钮,所有这些按钮都工作正常,但是当您单击最大化并且它已经最大化时,它并没有取消最大化。这是我的代码: const $
目前我在这里面临着危机。 问题是,当我尝试使用 Windows 窗体的默认 WebBrowser 控件打开 G-Mail 时,它说浏览器不支持较新版本的 HTML 即 XHTML。 那么,有人能建议我
我遇到了一个让我发疯的问题。我在一个网站上工作,该网站在与主导航相同的 div 中有一个框。它一直显示到右边(栏的宽度为 100%),我需要它显示在带有主导航的 div 中(宽度 1020px) 我正
我是一名优秀的程序员,十分优秀!