お知らせ

ただいま、シンタックスハイライターの設定を見直しております。
プログラムが見にくくなっているページがありますが、ご容赦ください。

ブラックジャックでの戦略をほんの少しだけ考えてみる

モデル化とシミュレーション

こんにちは。まだまだブラックジャックで考えてみます。

一応書いておきますが、高校生が考えたものではありません。

戦略を一つだけ考えてみる

前回は、17以上になるまでヒットし続けるというディーラーと同じ戦略をとってみました。

ディーラーに勝てない理由は簡単で、バーストしたら負けてしまうというルールのせいです。

だったら「バーストしなきゃいいんじゃね?」という発想です。

単純ですね。

バーストする確率は前々回の投稿で求めていました。

バーストしない確率=1-バーストする確率

ということで、この確率でヒットしてみます。

あまりにも何も考えていなさすぎて、胡散臭さ過ぎます・・・

プログラムしてみる

とりあえず、プログラムを変えてみます。

strategyという変数にバーストしない確率を記憶して、乱数がこの確率を下回ったときにヒットするようにしました。

import random
def draw():
    x = random.randint( 0, 51 )
    while x in ca:
        x = random.randint( 0, 51 )
    ca.append(x)
    return x
def calc( hand ):
    s = 0
    flag = False
    for h in hand:
        s += 10 if ( h % 13 ) > 9 else ( ( h % 13 ) + 1 )
        if h % 13 ==0:
            flag = True
    if s < 12 and flag:
        s += 10
    return s
strategy = [ 0     , 0     , 0     , 0     , 1.0000,
             1.0000, 1.0000, 1.0000, 1.0000, 1.0000,
             1.0000, 1.0000, 0.6884, 0.6137, 0.5397,
             0.4629, 0.4005, 0.3210, 0.2446, 0.1633,
             0.0813, 0.0000 ]
point = 0
cnt = {}
wi = 0
lo = 0
dr = 0
tr = 1000000
for i in range( 0, tr ):
    ca = []
    c_hand = [ draw() ]
    d_hand = [ draw() ]
    c_hand.append( draw() )
    d_hand.append( draw() )
    cp = calc( c_hand )
    dp = calc( d_hand )
    if cp==21 and dp!=21:
        wi += 1
        point += 1.5
        continue
    elif cp!=21 and dp==21:
        lo += 1
        point -= 1.0
        continue
    while cp < 21 and random.random() < strategy[cp]:
        c_hand.append( draw() )
        cp = calc( c_hand )
    if cp > 21:
        lo += 1
        point -= 1.0
        continue
    while dp < 17:
        d_hand.append( draw() )
        dp = calc( d_hand )
    if dp > 21:
        wi += 1
        point += 1.0
        continue
    if cp > dp:
        wi += 1
        point += 1.0
    elif cp < dp:
        lo += 1
        point -= 1.0
    else:
        dr += 1
print('プレーヤー: 勝ち{}回 引き分け{}回 負け{}回'.format( wi, dr, lo ))
print('プレーヤー: 勝ち{:0.2f}% 引き分け{:0.2f}% 負け{:0.2f}% 掛金{:0.1f}'
        .format( wi*100/tr, dr*100/tr, lo*100/tr , point ))

実行結果は・・・

それでは実行してみます。

プレーヤー: 勝ち394546回 引き分け67538回 負け537916回
プレーヤー: 勝ち39.45% 引き分け6.75% 負け53.79% 掛金-120042.0

悪化しました・・・(゚∀゚)

ディーラーがバーストするかしないか考えないとダメですよね・・・

顔を洗って出直してくることにします。

今回はこれでおしまいにします。それではまた。

Posted by kasugai