トランプ遊びでの数理

 投稿者:GAI  投稿日:2014年 8月25日(月)17時06分22秒
  10枚のトランプを裏向きに
□□□□
□  □
□□□□
の形に並べる。
何処の位置からスタートしてもいいから
左回り、もしくは右回りに
スタートを"1”として4つ目のカードを表向きにする。
引き続いて、どこの位置の裏向きカードでもかまわずそこをスタートとして
4つ目にあたるカード(表向きになったカードもカウントする。)
をやはり表向きにする。
これを可能な限り繰り返したとき、最後まで裏向きのままの状態のカード
の数(多分1,2,3,4,5のいずれかになる。)の確率分布が知りたいのですが、式で表せないときはモンテカルロなどの手法による実験数値を知りたいので願いします。
 

Re: トランプ遊びでの数理

 投稿者:しばっち  投稿日:2014年 8月25日(月)21時37分25秒
  > No.3466[元記事へ]

GAIさんへのお返事です。

確率分布の出し方というのがよくわかりませんが
とりあえず作ってみました。
また、裏向きのままの状態でなく、表向きになった状態を表しています。あしからず

RANDOMIZE
DIM A(10),B(10),M(1024)
FOR L=1 TO 1000 !'試行回数
   MAT A=ZER !'カード全てを裏の状態とする
   MAT B=ZER
   LET S=0
   DO
      DO
         LET I=INT(RND*10)+1 !'任意の位置のカード
      LOOP UNTIL A(I)=0 !'裏向きのカードなら
      IF RND<.5 THEN LET I=I+3 ELSE LET I=I-3 !'右回り、左回りに相当
      IF I>10 THEN LET I=I-10
      IF I<1 THEN LET I=I+10
      LET A(I)=1 !'表向きにする
      LET FL=0
      FOR J=1 TO 10
         IF A(J)<>B(J) THEN
            LET FL=1 !'前回と違うなら
            LET S=0
         END IF
      NEXT J
      IF FL=0 THEN LET S=S+1 !'前回と同じ状態ならカウント
      IF S>10 THEN !'同じ状態が10回続くなら
         LET Z=0
         FOR J=1 TO 10
            LET Z=Z*2+A(J) !'各状態を2進法とみなす
         NEXT J
         LET M(Z)=M(Z)+1 !'カウントする
         EXIT DO
      END IF
      MAT B=A !'状態をコピー
   LOOP
NEXT L
MAT B=ZER
FOR I=1 TO 1024 !'各状態の表示
   IF M(I)>0 THEN
      PRINT RIGHT$("000000000"&BSTR$(I,2),10);" ";M(I)
      LET N=BITCOUNT32(I) !'bitの数
      LET B(N)=B(N)+M(I)
   END IF
NEXT I
PRINT
FOR I=1 TO 10
   PRINT I;B(I)
NEXT I
END

EXTERNAL FUNCTION BITCOUNT32(X) !'32bitの中の"1"の数
LET X=BITAND(X,BVAL("55555555",16))+BITAND(INT(X/2),BVAL("55555555",16))
LET X=BITAND(X,BVAL("33333333",16))+BITAND(INT(X/4),BVAL("33333333",16))
LET X=BITAND(X,BVAL("0F0F0F0F",16))+BITAND(INT(X/16),BVAL("0F0F0F0F",16))
LET X=BITAND(X,BVAL("00FF00FF",16))+BITAND(INT(X/256),BVAL("00FF00FF",16))
LET X=BITAND(X,BVAL("0000FFFF",16))+BITAND(INT(X/65536),BVAL("0000FFFF",16))
LET BITCOUNT32=X
END FUNCTION
 

Re: トランプ遊びでの数理

 投稿者:GAI  投稿日:2014年 8月26日(火)07時54分29秒
  > No.3467[元記事へ]

しばっちさんへのお返事です。


プログラムの提供ありがとうございます。
自分でもある程度作ってみようと挑戦していたんですが、こんなにいろいろなテクニックを駆使しなければならないなんてとてもできません。
表にできる枚数は何回も実行してみて、4~9枚(裏のままでは1~6枚)であることがわかりました。
(表4枚でストップすることに気付かなかった。でもそのパターンを探そうとしても見つけられなかった。できたらこの状態になるパターンを教えて下さい。)
中でも9枚を表にすることはランダムにやっていたらなかなか起こらない現象ですが、戦略的に前の試行で表にしたカードに対する"1"番の裏向きカード(カウントをはじめたであろう裏向きカード)を表にできるように次の試行を起こす。
という戦略を続けていくと9枚のカードを表にすることができます。

 

Re: トランプ遊びでの数理

 投稿者:しばっち  投稿日:2014年 8月26日(火)18時42分45秒
  > No.3468[元記事へ]

GAIさんへのお返事です。

> (表4枚でストップすることに気付かなかった。でもそのパターンを探そうとしても見つけられなかった。できたらこの状態になるパターンを教えて下さい。)

FOR I=1 TO 1024 !'各状態の表示
   IF M(I)>0 THEN
      PRINT RIGHT$("000000000"&BSTR$(I,2),10);" ";M(I)
      LET N=BITCOUNT32(I) !'bitの数
      IF N=4 THEN INPUT D$ !'←このように一旦止めて見て下さい。
      LET B(N)=B(N)+M(I)
   END IF
NEXT I

BITCOUNT32関数は32bitの中で"1"の数を表していて、
その数が、このプログラムでは表向きの数となっています。
矢印のようにしてしてみると分かると思います。

但し、プログラムのチェックの甘さからきたバグの可能性もあります。
同じ状態が10回以上続くならを100回以上続くならに変更してみてください。


      IF FL=0 THEN LET S=S+1 !'前回と同じ状態ならカウント
      IF S>100 THEN !'← 同じ状態が100回続くなら
         LET Z=0
         FOR J=1 TO 10
            LET Z=Z*2+A(J) !'各状態を2進法とみなす
         NEXT J
         LET M(Z)=M(Z)+1 !'カウントする
         EXIT DO
      END IF
 

Re: トランプ遊びでの数理

 投稿者:GAI  投稿日:2014年 8月26日(火)20時07分23秒
  しばっちさんへのお返事です。



> 同じ状態が10回以上続くならを100回以上続くならに変更してみてください。
>
>
>       IF FL=0 THEN LET S=S+1 !'前回と同じ状態ならカウント
>       IF S>100 THEN !'← 同じ状態が100回続くなら

の指示で走らせますと4での集計はいつも0の結果になりました。
表4枚になることはないと解釈していいんでしょうか?
9での集計はたまに1になります。
 

Re: トランプ遊びでの数理

 投稿者:山中和義  投稿日:2014年 8月27日(水)10時12分38秒
  > No.3466[元記事へ]

GAIさんへのお返事です。

> 10枚のトランプを裏向きに
> □□□□
> □  □
> □□□□
> の形に並べる。


シミュレーションで場合の数を求めてみました。 2進モードで実行してください。


LET N=10 !カードの枚数

!⑤④③②
!⑥  ①
!⑦⑧⑨0
DIM A(0 TO N-1) !並び
MAT A=ZER !すべて裏にする

DIM B(0 TO 2^N-1) !(ビット)パターンごとの場合の数
MAT B=ZER
CALL try(A,N,B)

!!MAT PRINT B; !debug
DIM C(0 TO N) !裏の個数ごとの場合の数
MAT C=ZER
LET T=0 !総数
FOR i=0 TO 2^N-1
   LET X$=right$("000000000"&BSTR$(i,2),N) !パターン
   LET S=0 !裏の個数
   FOR J=1 TO N
      IF X$(J:J)="0" THEN LET S=S+1
   NEXT J
   PRINT X$; S; B(i)

   LET C(S)=C(S)+B(i)
   LET T=T+B(i)
NEXT i

PRINT T
FOR i=0 TO 10
   PRINT i; C(i)/T
NEXT i
END

EXTERNAL SUB try(A(),N,B()) !バックトラック法で検証する
LET FLG=0
FOR i=0 TO N-1 !基準のカードが裏なら
   IF A(i)=0 THEN
      LET X=MOD(i-3,N) !右回りの4枚目の位置
      IF A(X)=0 THEN !4枚目を表にする
         LET A(X)=1
         CALL try(A,N,B) !次へ
         LET A(X)=0
         LET FLG=-1 !ひっくり返した
      END IF
      LET Y=MOD(i+3,N) !左回り
      IF A(Y)=0 THEN !4枚目を表にする
         LET A(Y)=1
         CALL try(A,N,B)
         LET A(Y)=0
         LET FLG=-1
      END IF
   END IF
NEXT i

IF FLG=0 THEN !これ以上ひっくり返せない
!!MAT PRINT A; !debug
   LET S=0 !ビットパターンで並びを記録する
   FOR i=0 TO N-1
      LET S=S*2+A(i)
   NEXT i
   LET B(S)=B(S)+1
END IF
END SUB


0  0
1  3.77002827521206E-3
2  .239396795475966
3  .567389255419416
4  .183788878416588
5  5.6550424128181E-3
6  0
7  0
8  0
9  0
10  0

 

Re: トランプ遊びでの数理

 投稿者:GAI  投稿日:2014年 8月27日(水)19時39分21秒
  > No.3471[元記事へ]

山中和義さんへのお返事です。

しばっちさんに作って頂いたプログラムで100万回試行したら
裏向きのまま残るカードの枚数が
1枚  :    24回
2枚  : 18985回
3枚  :345183回
4枚  :572847回
5枚  : 62961回
なる結果をえていました。

一方山中さんのプログラムでは
下記の結果ですので随分開きがあるように感じます。
これはどの様に解釈しておけば良いのでしょうか?
また確率値の前に1358080が出力されていますが
これはなにを表す数字ですか。
またカードの枚数を13枚で調べるときは
プログラムの
LET X$=right$("000000000"&BSTR$(i,2),N) !パターン
の部分は
LET X$=right$("000000000000"&BSTR$(i,2),N) !パターン
にしておけばいいのでしょうか?

  1358080
>  0  0
>  1  3.77002827521206E-3
>  2  .239396795475966
>  3  .567389255419416
>  4  .183788878416588
>  5  5.6550424128181E-3
>  6  0
>  7  0
>  8  0
>  9  0
>  10  0
>
>  
 

Re: トランプ遊びでの数理

 投稿者:山中和義  投稿日:2014年 8月27日(水)22時44分10秒
  > No.3472[元記事へ]

GAIさんへのお返事です。

> 下記の結果ですので随分開きがあるように感じます。
> これはどの様に解釈しておけば良いのでしょうか?

まだひっくり返せるのに、途中で中断しているのではないでしょうか。


> また確率値の前に1358080が出力されていますが
> これはなにを表す数字ですか。

「場合の数」の総数です。
真の値は、円順列なので、1番目の位置を固定しないといけないと思います。


> またカードの枚数を13枚で調べるときは
> プログラムの
> LET X$=right$("000000000"&BSTR$(i,2),N) !パターン
> の部分は
> LET X$=right$("000000000000"&BSTR$(i,2),N) !パターン
> にしておけばいいのでしょうか?

LET X$=right$(REPEAT$("0",N-1)&BSTR$(i,2),N) !パターン

 

戻る