sironekotoroの日記

Perl で楽をしたい

Perl入学式 2018 in東京 秋開講 第1回 お疲れ様でした

Perl入学式 2018 in東京 秋開講 第1回

受講された方、サポーターの方、お疲れ様でした。
講師をやったジャージの人です。

今期からの新要素は以下となります。

  • Windowsユーザ向けにmsys2でUNIX環境を構築し、その上でPerlを実行
  • スライド共有

不慣れなところが多く、お手数をおかけしました。

今回ですが、Perlの学習内容としては print "Hello! World"; のみなので特に復習問題はないです。
また来月お会いしましょう!

Perl入学式 2018 in東京 秋開講 第1回 ピザ会の課題

Perl入学式 in東京 では講義終了後、希望者で集まりピザ会と称した懇親会を行っています。
(ジュース・ピザ代は実費)
昨年からそこで余興として xtetsuji さんが課題を出し、そこにチャレンジャーが回答して公開する、というようなことをやってます。

今回の出題は、シミュレーションでした。
過去の出題傾向からてっきりWebからスクレイピングってネタが来ると思ってたので完全に不意打ち。

ルール

  • プレイヤーA、プレイヤーBに手札が3枚配られる
    • 今回は配られる手札は固定
    • プレイヤーA:1, 5, 10
    • プレイヤーB:2, 2, 2
  • 1 〜 40 の目がランダムに出るルーレットを3回まわし、手札と同じ数字が出たら手札を捨てる
  • プレイヤーBのように同じ手札が複数枚ある場合には、同じ目が出ても捨てられるカードは1枚だけ
  • 先にカードがなくなった方が勝ち

ヒント

  • 1 〜 40 のランダムな数字を出すには int( rand(40) + 1 ) を使う

うちの予想

  • 3枚のカードが来て、ルーレットも3回まわすんだから、プレイヤーAもプレイヤーBも勝率は同じなのではないか?

コード

ピザ会で書いたものを少し改変して、コメントを入れてアップしています。

Perl入学式でやる範囲の内容のみ、かつリファレンスを使わない、という縛りで書いてみました。
結果、めっちゃ煩雑になりましたわ・・・

Perl入学式 2018 in東京 秋開講 第1回 ピザ会でのお題 — Bitbucket

なお、コードを実行すると勝利回数は6〜7倍プレイヤー1の方が高いですが、これは確率的に正しいとのこと。
うちはサイコロに置き換えて考えて納得した気になってるけど、正しいかどうか不安・・・

サイコロに置き換えると

  • プレイヤーAの手札(1, 3, 5)
    • 出た目が 1, 3, 5 どれかに合致すれば札を捨てられる
      • 最初に 1 が来ても 3 が来ても 5 が来ても手札を捨てることができる
    • 3/6 * 2/6 * 1/6 = 6/216
  • プレイヤーBの手札(2, 2, 2)
    • 3回とも同じ目が出なくてはいけない
    • 1/6 * 1/6 * 1/6 = 1/216

これで約6倍の差、って言ってたのもわかる気がする・・・合ってるかな?

そういえば

確率の面白問題として「モンティホール問題」ってのがあるんですが、それをPerlで解いたことあったなぁ、ってことで。

sironekotoro.hateblo.jp