No.02861 Rで"おいちょかぶ"を再現  【波音】 2007/02/27(Tue) 02:12

今,このような問題(http://www37.tok2.com/home/mtbmogmov/hanafuda.htm)を考えているのですが,Rで"おいちょかぶ"をシュミレーションするとしてもあまりに難しすぎるでしょうか?つまり"おいちょかぶ"をRで再現できるかという問題です(もちろん,可能でしょうが専門家でも悩むようだと私には到底無理ということになってしまいます)。

例えば,最初からすでにつまずいている問題があるのですが,URLの考え方1)についてです。

all.fuda <- 1:40
sample(all.fuda, n, replace = FALSE)

としたいのですが,まず第1に取り出す枚数nは0から39まで考えられますが,「37枚カットした場合,残りの枚数は2枚なので配る札が当然ながら足りなくなる。この場合,カットされた37枚から配られることになる。」という行為をどのように再現すればよいでしょうか。

例えば,{1,2,3,4,5,6,7,8,9}という数から無作為に4つ抽出し,その中からさらに2つ抽出する場合は

a <- 1:9
b <- sample(a, 4, replace = FALSE)
sample(b, 2, replace = FALSE)

で問題ありませんが,2つ抽出して足りない分は抽出されなかった7つからさらに2つ抽出すると言う行為は

a <- 1;9
b <- sample(a, 2, replace = FALSE)
sample(b, 4, replace = FALSE) #こんなことはできない

だから,
sample(b, 2, repleace = FALSE)

としてから残りの7つの中からさらに2つ抽出するには???

No.02863 Re: Rで"おいちょかぶ"を再現  【青木繁伸】 2007/02/27(Tue) 07:34

元の札の集合から,実際に配られた札を取り除く方法
> (a <- 1:9) # 元の札
[1] 1 2 3 4 5 6 7 8 9
> (b <- sample(a, 4, replace = FALSE)) # 取りあえず取り出し
[1] 1 9 7 8
> (x<- sample(b, 2, replace = FALSE)) # そこから配る
[1] 7 1
> (y <- a[-sapply(x, function(i) which(a==i))]) # 配られた札を元の札から削除する
[1] 2 3 4 5 6 8 9

No.02864 Re: Rで"おいちょかぶ"を再現  【takahashi】 2007/02/27(Tue) 11:20

手順2,5あたりのルールがちょっと特殊な気がしますが,それはおいといて。

>2つ抽出して足りない分は抽出されなかった7つからさらに2つ抽出すると言う行為は
> (a<-1:9)
[1] 1 2 3 4 5 6 7 8 9
> (b<-sample(a,2))
[1] 5 1
> (x<-c(b,sample(a[!a%in%b],2)))
[1] 5 1 6 7
ですが,ゲームの性質上これは
> (x<-sample(a,4))
[1] 4 6 2 1
と等価でしょう。

一応ゲームとして行うならこんな感じ?
while(TRUE){
C<-sample(rep(1:10,4),40) ## カードシャッフル
tbl<-data.frame(matrix(NA,nr=5,nc=5),row.names=c(1:4,"p")) ## 場
names(tbl)<-c("C1","C2","C3","Select","Sum")
tbl$C1<-c(C[1:4],NA);tbl$Select<-rep("",5);print(tbl) ## 1枚目
while(is.na(r1<-as.numeric(readline("どれにする(1-4)?")))|r1<1|4<r1){} ## 選ぶ
tbl$Select[r1]<-"*";tbl$C2<-c(C[5:8],NA);print(tbl) ## 2枚目
if(3<C[r1]+C[4+r1]&C[r1]+C[4+r1]<7){ ## もし2枚の合計が??なら
while(!((r2<-readline("もう一枚(y/n)?"))%in%c("y","n"))){} ##もう一枚引くかどうか
if(r2=="y"){tbl$C3[r1]<-C[9];print(tbl)} ## 引くなら3枚目
}
for(i in 1:sample(2:3,1))tbl["p",i]<-C[41-i] ## 親の札
for(i in 1:5)tbl$Sum[i]<-sum(tbl[i,1:3],na.rm=TRUE)%%10 ## 一応合計
## ここで役の判定とか勝敗とか賭金処理とか
print(tbl) ## 最終結果
while(!((r3<-readline("もう一回(y/n)?"))%in%c("y","n"))){}
if(r3!="y")break
}

No.02865 Re: Rで"おいちょかぶ"を再現  【青木繁伸】 2007/02/27(Tue) 13:54

採点事務などがあり,やっと解放されました(^_^;)

さて,ゲームの同等性ということから言えば,カットされた札は使わない(ただし,必要になったら使う)ということは,結局「制約がない」ということですよね。

40枚の札をランダムにシャッフルし x <- sample(1:40),順に使っていくと言うことに過ぎませんね。

札の持つ情報は数字と絵と短冊との有無(赤・青・無)の3種類だから,リストで持つかデータフレームとして持つかにすればよいかも(データフレームの方が扱いやすいかな?)。
ルールの細かいところが分からないので,実際にシミュレーションプログラムを書くのがちょっと難しい。

No.02868 Re: Rで"おいちょかぶ"を再現  【青木繁伸】 2007/02/27(Tue) 15:17

オイチョカブの解説ページなんかをちょっと読んでみました。
札の配られ方には,ゲームに参加するものの意 志がはいるので,シミュレーションはかなり難しいのではないでしょうか。つまり,2枚の札でやめるのか3枚の札まで取るかによって,2枚しか取らなけれ ば,イノシカチョウは絶対できませんよね?3枚目を取るかどうかを確率で決めるにしても,その確率を幾つに設定するかで当然結果は変わってくるわけだし。

手順5で「2枚の札の合計が3以下,または7以上の場合は札をもらうことができない」とあるが,それにしても,4,5,6のときはもらうことも,もらわないこともできるということでしょうね?

合計が3以下のときには必ずもらわないといけない,7以上のときにはもらうことができないとか,6のときだけもらえるとかいろいろローカルルールもあるようです。

No.02872 Re: Rで"おいちょかぶ"を再現  【波音】 2007/02/27(Tue) 23:02

青木先生にtakahashi先生,まずは回答ありがとうございます。

> 合計が3以下のときには必ずもらわないといけない,7以上のときにはもらうことができないとか,6のときだけもらえるとかいろいろローカルルールもあるようです。

URLには「3以下の場合は引いてはいけない」と記してしまいましたがあれは誤りです(訂正しておきました)。正しくは「3以下の場合は引かなくてはいけない」です。そして4,5,6のいずれかの場合は引くか否かを子が決めることができます。

> 3枚目を取るかどうかを確率で決めるにしても,その確率を幾つに設定するかで当然結果は変わってくるわけだし。

確かにその通りで,仮にc3に張った子がすべて青短を狙って3枚目を引いたとしても,その前のc1とc2に張った子が3枚目を引くかどうかによっても結果は影響されてしまうのですよね。

4 の時に3枚目を引く確率,5の時に3枚目を引く確率,6の時に3枚目を引く確率は実際に勝負の記録を何百回もとる必要がありそうですね。経験的には4の時 は80%〜90%,6の時は80%〜90%引かない,5の時は50%くらいと予想できますが当てにはなりませんからね。。。

しかし,仮にすべての人が3枚目を引くとしてもイノシカチョウにしても,青短にしても,その確率はとてつもなく低いのでしょうね。アラシの確率は30%くらいはありそうですが。

かなり難しそうですが,もう少し頭をひねってみようと思います。

No.02873 Re: Rで"おいちょかぶ"を再現  【takahashi】 2007/02/28(Wed) 02:49

>確かにその通りで,仮にc3に張った子がすべて青短を狙って3枚目を引いたとしても,その前のc1とc2に張った子が3枚目を引くかどうかによっても結果は影響されてしまうのですよね。

あんまり考えてませんが,「c3に張った子がある役になる確率」は他の人が引くか引かないかにはよらないでしょう。
c1,c2に張った子の手札を見て,3枚目を引くかどうか決めるなら別だけど。

青木先生の指摘されている,3枚目を引くか引かないかの決定に制約がない以上,この問題は解けませんが,その制約を決めてしまえば,話はそんなに難しくないですよ。
仮に,引けるときは必ず3枚目を引くのであれば,

p(2枚引いたときに3枚引ける確率)*p(3枚目を引いたときにある役が出来る確率)

という感じかな?

言い方を変えれば,
(最初の2枚が3枚引ける組み合わせで,3枚で役になっている事象の数)/全事象40P3

なので3枚が同じ数字な確率は
6*4P3/40P3

でいいのかな。ちょっと頭働いてないので自信はありませんが。

No.02877 Re: Rで"おいちょかぶ"を再現  【波音】 2007/02/28(Wed) 18:35

例えばc1の札が [1][4] とあった場合,3枚目に来るべき札が青短のいずれかであれば,もし3枚目を引け ばc2に青短がくることは在り得なくなってしまいますし,逆に3枚目を引かなければc2に青短がそろう可能性は出てくる。だから,後に配られる札に影響が 出ると考えていたのですが。。。

しばらく考えていたのですが,やはり青木先生が最初にいったように「ゲームに人の意思が入ってくるので難 しい」と思えてきました。例えば,1枚目に松(=1)があり,その札に張って2枚目に藤(=4)がきた場合と1枚目に梅(=2)があり,その札に張って2 枚目に桜(=3)が北場合とでは3枚目を引くか否かを大きく左右されるからです。

後は札に張っている金によっても違うでしょうし,自分の好きな札のときでも判断が異なることもあります。かなり多くの制約をつければシュミレーションも可能でしょうが,細かいことまで考えると把握しきれない。

博打は確率じゃないのか,,,

No.02878 Re: Rで"おいちょかぶ"を再現  【takahashi】 2007/02/28(Wed) 18:53

> 例えばc1の札が [1][4] とあった場合,3枚目に来るべき札が青短のいずれかであれ
> ば,もし3枚目を引けばc2に青短がくることは在り得なくなってしまいますし,逆に3枚目
> を引かなければc2に青短がそろう可能性は出てくる。だから,後に配られる札に影響
> が出ると考えていたのですが。。。

これは条件付確率で,勿論,他の子が3枚目を引いたか引いてないか,それが何であったかによって変わります。
要は,いつの時点での確率を知りたいのか,ということです。

>博打は確率じゃないのか,,,

いかさまが無ければ,博打は確率でしょう。
張りも期待値に還元できるかも知れません。但し,これに関してはいろいろなパラドクスがあって,一筋縄には行きません。

No.02881 Re: Rで"おいちょかぶ"を再現  【波音】 2007/02/28(Wed) 22:03

takahashi先生,度々の回答ありがとうございます。

なるほど,ちょっとした興味本位で考 え始めたことですが,いろいろと考えていると"遊び"(大金を動かしている人にとってはそうでないでしょうが)もかなり専門的に扱える行為というか現象な のですね。これはちょっと本腰を入れてやってみようと思います。数学科であったら,これを卒論に書きたいくらいです。

でもとりあえずは,就職活動なるものをしなければならないので,合間をみながらやっていこうと思います。また行き詰まったら投稿させてもらいますのでよろしくお願いします。

● 「統計学関連なんでもあり」の過去ログ--- 040 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る