自作ブラックジャックのCPUが強すぎる気がしたので、自動で1万回プレイして勝率を確認してみた


「これプレイヤーが勝てないように仕組んでない?」

G'sアカデミーというプログラミングスクールを卒業しました。卒業生は再履修できるのでもう一周しています。

じゃんけんをJavascriptで作るという課題があり、ブラックジャックをKotlin Javascriptで作って提出しました(G'sの課題はカオスの塊)。チェックしてくれたスタッフのAさんに「昨日からプレイしているけど、1回も勝てていない。これプレイヤーが勝てないように仕組んでない?」と聞かれました。

そんな仕様にした記憶はなかったので、自分でも再度プレイしたのですが3勝10敗でした。確かにちょっと勝率が偏っているかもしれません。勝率が50%だとすると3勝10敗になる確率は3.5%くらい(数学苦手なので計算間違ってるかも)

検証しよう

たまたま運が悪かっただけかもしれないので、試行回数を1万回ぐらいに増やして勝率を計算してみましょう。手でポチポチするのはめんどくさいです。怠惰はプログラマの美徳です。めんどくさいことはプログラムにさせましょう。

という訳で、Seleniumに自分が作ったブラックジャックを1万回ぷれいさせることにしました。

私の環境とバージョン情報

今回は特に環境がハマりどころなので要注意(後述)

  • OS: Windows10 1803
  • intelliJ: 2019.3 Community Edition
  • Kotlin: 1.3.41-release-150 (JRE 1.8.0_202-release-1483-b03)
  • Selenium: selenium-server-standalone-3.141.59.jar
  • Chrome: 79.0.3945.79
  • Chrome driver: 79.0.3945.36
  • npm: 6.9.0

テストしたいブラックジャック

https://nagashimam.github.io/BlackJack/
ソース:https://github.com/nagashimam/BlackJack

Seleniumスクリプト

ソース:https://github.com/nagashimam/BlackJackTest

スクリプトを書く際のハマりどころ

環境構築自体はたくさん記事があるので、私がハマったところについて。

Chromeとドライバーのバージョン

この2つの整合性が取れていないとTimeoutExceptionで強制終了になります。ドライバーのどのバージョンがどのChromeに対応しているかはドキュメントを参照してください

有効な Win32 アプリケーションではありません。

エラーメッセージを保存し忘れたので若干違うかもしれませんが、npmでドライバーをインストールすると、上記のエラーメッセージが出てスクリプトを実行できません

コマンドプロンプトで

where chromedriver

と打つと

(パス)/chromedriver
(パス)/chromedriver.cmd

と出てきました。正しい方法ではないかもしれませんが、私の環境ではchromedriver(cmdがついていない方)を削除すると動くようになりました。

検証結果

保存する前にブラウザを閉じてしまった(笑)ので、記憶違いかもしれませんが勝率は42%だったはずです。
1万回実行した後にスクリーンショットをとるようにスクリプトを変えたので、今晩もう一度実行してみます。

仮に勝率を40%とすると、3勝10敗になる確率は11%ほどなので、ありえなくはないかな、ぐらいの数字ですね。