Rで麻雀

3,319 views

Published on

第7回 R勉強会@東京
@mangantempyによるLT資料。

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,319
On SlideShare
0
From Embeds
0
Number of Embeds
506
Actions
Shares
0
Downloads
15
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Rで麻雀

  1. 1. Rで麻雀<br />2010.07.24<br />@mangantempy<br />
  2. 2. アジェンダ<br />自己紹介<br />このLTのねらい<br />麻雀のルール<br />下準備<br />面子の作りやすさ<br />あがれる確率<br />
  3. 3. 自己紹介<br />ID : @mangantempy<br />職業: Webエンジニア<br />学生時代: 数理情報科学授業についていけず数学嫌いに。<br />好きな物: 一風堂、マンガ、麻雀<br />
  4. 4. このLTのねらい<br />Rを使ってみる<br />麻雀の研究<br />麻雀の布教<br />
  5. 5. 麻雀のルール<br />互いに持ち点を奪い合うゲーム<br />25,000<br />0<br />Aさん<br />Bさん<br />Cさん<br />Dさん<br />
  6. 6. 麻雀のルール<br />互いに持ち点を奪い合うゲーム<br />25,000<br />0<br />Aさん<br />Bさん<br />Cさん<br />Dさん<br />
  7. 7. 麻雀のルール<br />互いに持ち点を奪い合うゲーム<br />25,000<br />0<br />Aさん<br />Bさん<br />Cさん<br />Dさん<br />
  8. 8. 麻雀のルール<br />互いに持ち点を奪い合うゲーム<br />25,000<br />0<br />Aさん<br />Bさん<br />Cさん<br />Dさん<br />
  9. 9. 麻雀のルール<br />136枚の「雀牌」を使う<br />萬子(マンズ)<br />筒子(ピンズ)<br />索子(ソウズ)<br />字牌(ジハイ)<br />34種類 * 各4枚 = 計136枚<br />
  10. 10. 34種類 * 各4枚 = 計136枚<br />
  11. 11. Rでやると・・・<br />> ( 9 + 9 + 9 + 7 ) * 4<br />[1] 136<br />> <br />
  12. 12.
  13. 13. 麻雀のルール<br />和了(あがり)の形<br />14枚<br />3枚<br />3枚<br />3枚<br />3枚<br />2枚<br />順子(シュンツ)<br />刻子(コウツ)<br />雀頭(アタマ)<br />種類が同じで、<br />数字が3つ連続するような<br />3枚の牌の組み合わせ<br />同じ牌を3枚<br />同じ牌を2枚<br />
  14. 14. Rでやると・・・<br />> ( 3 * 4 ) + 2<br />[1] 14<br />> <br />
  15. 15.
  16. 16. 麻雀のルール<br />一翻役<br />平和<br />断ヤオ九<br />一盃口<br />立直<br />門前清自摸<br />翻牌<br />海底摸月<br />河底撈魚<br />嶺上開花<br />搶槓<br />一発<br />ドラ<br />二翻役<br />三色同順<br />一気通貫<br />対々和<br />七対子<br />全帯ヤオ<br />混老頭<br />三暗刻<br />三色同刻<br />三槓子<br />小三元<br />ダブルリーチ<br />三翻役<br />純全帯ヤオ<br />混一色<br />二盃口<br />役満<br />九連宝燈<br />緑一色<br />四暗刻<br />四槓子<br />清老頭<br />国士無双<br />大三元<br />小四喜<br />大四喜<br />字一色<br />天和<br />地和<br />人和<br />キレイな手ほど<br />点数が高い。<br />六翻役<br />清一色<br />
  17. 17. 下準備<br />ここで一度麻雀からはなれて、<br />確率とRの一般的な話を。<br />
  18. 18. 「階乗」をRでやると・・・<br />𝑛!<br /> <br />> n <- 5<br />> prod(1:n)# 0! = 1 にならない<br />[1] 120<br />> gamma(n+1)<br />[1] 120<br />> factorial(1:5) # R 1.9 より登場<br />[1] 120<br />
  19. 19. 「組み合わせ」をRでやると・・・<br />𝑛𝐶𝑟=𝑛!𝑟!𝑛−𝑟!<br /> <br />> factorial(n) / (factorial(r) * factorial(n-r))<br />[1] 10<br />> choose(n, r)<br />[1] 10<br />
  20. 20. 「順列」をRでやると・・・<br />𝑛𝑃𝑟=𝑛!𝑛−𝑟!<br /> <br />> r <- 2<br />> factorial(n) / factorial(n-r)<br />[1] 20<br />> perm <- function(n, r)<br />+ factorial(n) / factorial(n-r)<br />> perm(n, r)<br />[1] 20<br />
  21. 21. 「総和」をRでやると・・・<br />𝑥=1𝑛𝑓𝑥=𝑓(1)+𝑓(2)+…+𝑓(𝑛)<br /> <br />> myfunc <- function(x) (x+1)^2<br />> sapply(1:5, myfunc)<br />[1] 4 9 16 25 36<br />> sum(sapply(1:5, myfunc))<br />[1] 90<br />
  22. 22. 【問題】<br />袋の中に全部で m 個のボールが入っており、<br />そのうち、アタリが t 個、ハズレが m-t 個とする。<br />この中から無作為に 1 個のボールを取り出し、<br />袋には戻さないという操作を k 回行う時、<br />k 回目で初めて当たりを引く確率は?<br />
  23. 23. 【答え】<br />k-1 回連続でハズレを引く確率は、<br />k 回目でアタリを引く確率は、<br />求める確率は、<br />𝑃1=(𝑚−𝑡)𝑃(𝑘−1) 𝑚𝑃(𝑘−1)<br /> <br />𝑃2=𝑡 (𝑚−(𝑘−1))<br /> <br />𝑃𝑎𝑡𝑎𝑟𝑖(𝑚,𝑡,𝑘)=𝑃1∗𝑃2=𝑚−𝑡𝑃𝑘−1∗𝑡 𝑚𝑃𝑘<br /> <br />
  24. 24. Rでやると・・・<br />𝑃𝑎𝑡𝑎𝑟𝑖(𝑚,𝑡,𝑘)=𝑚−𝑡𝑃𝑘−1∗𝑡 𝑚𝑃𝑘<br /> <br />> Patari <- function(m, t, k) {<br />+ if ((m-t) < (k-1) || m < k) 0 # エラー処理<br />+ else perm(m-t, k-1) * t / perm(m, k) # main<br />+ }<br />5個(アタリは 2 個)から、3 回目ではじめてアタリを引く確率<br />> Patari(5, 2, 3)<br />[1] 0.2<br />
  25. 25. これで<br />道具は揃った。<br />話を麻雀に戻します。<br />
  26. 26. 面子の作りやすさ<br />刻子が4つある場合…<br />⇒役は「四暗刻」。 32,000点~<br />順子が4つある場合…<br />⇒役は「平和」。 1,000点~<br />なんでそんなに違うの!?<br />
  27. 27. 刻子と順子<br />  を使った面子は・・・<br />順子(シュンツ)<br />刻子(コウツ)<br />
  28. 28.
  29. 29. 刻子と順子<br />  を使った面子を作る。有効牌は?<br />順子(シュンツ)<br />刻子(コウツ)<br />有効牌:1種3枚<br />
  30. 30.
  31. 31. 刻子と順子<br />  を使った面子を作る。有効牌は?<br />順子(シュンツ)<br />刻子(コウツ)<br />有効牌:1種3枚<br />有効牌:4種8枚<br />
  32. 32. こんなシチュエーションを想定<br />今  を1枚と、無関係な牌2枚を持っていると仮定して、<br /> (1) 残りの牌の中からランダムな牌を1枚引き、<br /> (2) 不要な牌を1枚捨てる<br />という操作を10回行うとき、<br />  を含む刻子or順子が完成する確率は?<br />
  33. 33.
  34. 34.
  35. 35. 刻子を作るには<br />
  36. 36. 順子を作るには<br />
  37. 37. こんなシチュエーションを想定<br />今  を1枚と、無関係な牌2枚を持っていると仮定して、<br /> (1) 残りの牌の中からランダムな牌を1枚引き、<br /> (2) 不要な牌を1枚捨てる<br />という操作を10回行うとき、<br />  を含む刻子or順子が完成する確率は?<br />
  38. 38. つまり・・・<br />全部で牌は136枚。<br />自分が最初に3枚持っているので、<br />残りは 136-3=133枚。<br />有効牌は、1種のみで残り3枚。<br />10回以内に、<br />3枚の有効牌のうち少なくとも2枚を引く。<br />
  39. 39. こう考える。<br />3枚の有効牌を含む133枚の牌の中から<br /> i 回目ではじめて有効牌を引き、かつ<br />2枚の有効牌を含む133-i 枚の牌の中から<br /> j 回目ではじめて有効牌を引く。<br />求める確率は、1≦i<10, 1≦j≦10-iとなる<br />すべての i, j についての確率の総和なので、<br />𝑃=𝑖=19𝑗=110−𝑖𝑃𝑎𝑡𝑎𝑟𝑖(133,3,𝑖)𝑃𝑎𝑡𝑎𝑟𝑖(133−𝑖,2,𝑗)<br /> <br />
  40. 40. Rでやると・・・<br />𝑃=𝑖=19𝑃𝑎𝑡𝑎𝑟𝑖(133,3,𝑖)𝑗=110−𝑖𝑃𝑎𝑡𝑎𝑟𝑖(133−𝑖,2,𝑗)<br /> <br />> Pkotu <- function(zen, yuko, kaisu) {<br />+ sum(sapply(1:(kaisu-1), function(i) {<br />+ sum(sapply(1:(kaisu-i), function(j) {<br />+ Patari(zen, yuko, i) * Patari(zen-i, yuko-1, j)<br />+ }))<br />+ }))<br />+ }<br />> Pkotu(133,3,10)<br />[1] 0.01475323<br />
  41. 41. 試行回数別に確率を見てみる<br />> ( result <- sapply(2:133, <br />+ function(x) Pkotu(133,3,x)) )<br /> [1] 0.0003417635 0.0010200727 0.0020297099 0.0033654574 0.0050220972<br /> [6] 0.0069944118 0.0092771832 0.0118651939 0.0147532259 0.0179360615<br /> [11] 0.0214084830 0.0251652727 0.0292012126 0.0335110851 0.0380896725 <br />:<br />[121] 0.9820639385 0.9852467741 0.9881348061 0.9907228168 0.9930055882<br />[126] 0.9949779028 0.9966345426 0.9979702901 0.9989799273 0.9996582365<br />[131] 1.0000000000 1.0000000000<br />
  42. 42. 試行回数別に確率を見てみる<br />> barplot(x, names=2:133) #棒グラフ<br />
  43. 43. 順子を作るには<br />
  44. 44. 以下、同様に。<br />刻子の時と同様に確率を求める。<br />パターンが多いから、場合分けが必要<br />  ⇒<br />  ⇒<br />  ⇒<br />  ⇒<br />  ⇒<br />  ⇒<br />グラフ化して、刻子のグラフと見比べる。<br />順子の方が断然作りやすい事が分かる!<br />
  45. 45. おしまい<br />ありがとうございました。<br />@mangantempy<br />

×