2013年12月21日土曜日

ブラックジャックのシミュレータをjavascriptで書いてみた

ブラックジャックのシミュレータは以前も作ったことがあるけど、今回はブラウザでも実行できるようjavascriptで作ってみた。 途中で力尽きしまったので、ディーラーのシミュレーション部分のみ作成。 概要は以下のとおり

  • ディーラーのアップカードを2~10, Aceのいずれかを選択する
  • 17以上になるまでカードを引く
  • 最終的なディーラーハンドの出現回数と割合を計算する


結果の見方

たとえば、ディーラーのアップカードが10のとき、バーストする確率は約22~23%というが分かる。 ということは、プレイヤーカードが16であったとしてもスタンドすればほぼ8割方負けしまうので、引いた方がまだましという判断になる。

シミュレータの場所

シミュレータのページはこちら

2013年8月31日土曜日

BlackJackシミュレータ作ってみた

ブラックジャックのそれぞれの手の場合にどれくらいの期待値で
勝てるのかを調べるために、Scalaでモンテカルロシミュレーションプログラムを作ってみた。


  • プレイヤーの手札が8~20の時に対して、ディーラーのアップカードが2~Aのそれぞれに対して、HIT/STAND/DOUBLEDOWNを500000回繰り返したときの期待値を求める。
  • カードは無限にあるものとする(カウンティングの要素は含まない)
  • 乱数は擬似乱数を使用する
  • サレンダーは考慮しない(アーリーサレンダーとレイトサレンダーを分けるのがしんどいので)
  • ディーラーはソフト17スタンドとする

結果



 こんな感じになった。表の各数値はHIT / STAND / DOUBLE DOWN をずっと繰り返したときの期待値です。各セル内の最大値となるものが、最適戦略となる。


他のサイトとの比較

 このあたりに掲載されているベーシックストラテジーと比較すると、一部微妙に違いがあるが、このあたりは乱数の性能の限界なのかもしれない。




作成したプログラム


GitHubに置いています。

2013年4月13日土曜日

家に帰ってブログ書くまでがシェル芸



春爛漫シェル芸人撩乱勉強会に参加してきた。
本日はwget, curl, sedさんたちが活躍する内容。 curlなんて入ってたっけ?と思うぐらい何もしない状態での参加をしてしまった。
 前回と同じく以下、自分の知らなかったことの(断片的な)まとめ。

curl, wget で画像URL収集

curl, wgetでhtmlファイルを持ってきて、そこからは必要なデータを切り出すという作業。
以下はimgタグにある画像データを取ってくる場合。

$ curl http://www.yahoo.co.jp | sed -e 's/<img src/\n&/g' | grep "img src" | grep http | sed -e 's/^[^"]*"//' | sed -e 's/".*$//'

http://k.yimg.jp/images/clear.gif
http://k.yimg.jp/images/clear.gif
http://k.yimg.jp/images/clear.gif
http://k.yimg.jp/images/clear.gif
・・・以下略

上のコマンドを見て気持ち悪いと持った人は正常な感性を持ってると思う。オレならこう書けるとか思った人は変態やと思う。

ひたすらsedでテキストをいじってるけど、このURL抜き出しに必要なsedイディオムは以下のようだった。
  • img srcタグ1つにつき1行にするように抜き出したいタグ(この場合img)の前に改行をぶちこむ
  • 先頭からURLの直前の'"'までと、URL以降を削除する。
正規表現は普通に書くと最長一致となり意図しない部分まで削られてしまうので、 ^[^"]*"のような気持ち悪い書き方になる。これは何とかならない物なのか。

grep -oオプションを使えばもう少し簡単にかけて、以下のような感じになった。
$ curl http://www.yahoo.co.jp | sed -e 's/<img src/\n&amp//g' | grep "img src" | grep -o 'http://[^"]*"' | tr -d \"


-oオプションは行単位ではなく、マッチした部分のみ出力する。これは一番明日から使える内容かもしれない。 

いずれにしろ、こういう書き方はワンライナーだから許されるものであってこんなのがスクリプトとして残っていたら見るほうが発狂しそう。

あと便利なgrepオプションついでに-A -B -C (NUM)オプションも素晴らしい。これはマッチした行の前後もあわせて表示すると言うもの。

% seq 1 10 | sort -R
% seq 100 110                                           
100
101
102
103
104
105
106
107
108
109
110

# マッチした次の行も表示
% seq 100 110 | grep -A 1 105
105
106
# マッチした前の行も表示
% seq 100 110 | grep -B 1 105  
104
105
# マッチした前後の行も表示
% seq 100 110 | grep -C 1 105 
104
105
106


curl, wgetでPOSTリクエスト

以下のようにすれば、wget, curlでもPOSTリクエストが送れる。 cronで定期的にリクエスト投げたいときに使えるかもしれない。
$ wget -O - --post-data=test http://www.usptomo.com/XXXXXXX
$ curl -d test  http://www.usptomo.com/XXXXXX


他にもいろいろあったけど、とりあえず酒が入ってものすごい眠いので今日はここまで!

2013年1月27日日曜日

Windows環境へPython, easy_installインストール手順


Linux環境ならすぐできたけど、Windows環境では環境変数の
設定などが多少必要だったのでメモ

環境:Windows 7
入れるもの: python2.7, easy_install

  1. Python公式サイトからpython2.7インストーラをダウンロード・実行
  2. すべてデフォルトでインストールすると、C:\Python27以下にディレクトリ・ファイルが生成される。
  3. 環境変数PATHに"C:\Python27"と"C:\Python27\Scripts"を追加。
  4. 環境変数PYTHON_HOMEにも"C:\Python27"追加。
  5. コマンドプロンプトからpythonと実行すると反応があることを確認。
以上でpythonインストール完了。
ついでにeasy_installも入れる。
  1. このWebサイトからez_setup.pyをダウンロード
  2. python ez_setup.py でインストール
  3. コマンドプロンプトからeasy_installと実行すると反応があることを確認。
以上




2013年1月2日水曜日

cmdおみくじ

正月で暇だからコマンドプロンプトで貼り付けたらおみくじの結果を表示するワンライナー書いてみた。 シェルだとすぐにできるけどDOSのコマンドだとどうやっていいのかなかなか分からなかったので、メモ代わりに残しておく。
SET /A R=%RANDOM% % 6+1 >null & for /f "tokens=%R%" %i in ("大吉 中吉 小吉 末吉 凶 大凶") do echo おみくじの結果は"%i"です。

おみくじの結果は"中吉"です。