|
> No.3506[元記事へ]
GAIさんへのお返事です。
> 従って統計的確率は0.024503・・・ 位だとは思われますがこの数値が妥当であるかを確認して頂きませんか?
とりあえず作ってみました。
下記のプログラムでもこれに近い値が出ました。
DIM CARD(52)
RANDOMIZE
LET M=10000 !'試行回数
FOR K=1 TO M
FOR I=1 TO 52
LET CARD(I)=MOD(I-1,13)+1 !'トランプ52枚
NEXT I
FOR I=1 TO 52
LET J=INT(RND*52)+1
SWAP CARD(I),CARD(J) !'カードシャッフル
NEXT I
LET FL=0 !'フラグをリセット
FOR J=1 TO 52 !'上からカードを引いていく
LET S=S+CARD(J)
IF MOD(J,4)=0 THEN !'4枚目なら
IF ISPRIME(S)=1 THEN '!素数ならループを抜ける
LET FL=1 !'フラグセット
EXIT FOR
END IF
LET S=0
END IF
NEXT J
IF FL=0 THEN LET COUNT=COUNT+1 !'カウントする
NEXT K
PRINT COUNT;COUNT/M
END
EXTERNAL FUNCTION ISPRIME(X) !'素数か
FOR I=2 TO SQR(X)
IF MOD(X,I)=0 THEN
LET ISPRIME=0
EXIT FUNCTION
END IF
NEXT I
LET ISPRIME=1
END FUNCTION
> また、4枚並べたときに素数でないとき5枚目を並べることに挑戦でき、それでも5枚の合計が素数でないなら
> 6枚目も挑戦できる(以下何枚でも)とルールを変更すれば、既に場に出たカードの種類が判明しているので
> 次のカードを出すか、出さないかをある程度確率的に戦略を取れそう。
> (次のカードを出すときそれで素数になる確率が0.5以上ならばカードを出すことをしない。従って新たに4枚まとめてテーブルに出すことになる。これを戦略にする。)
下記のプログラムでいいのかあまり自信がありません。(細かいところの解釈についても)
まず、「素数になる確率が0.5以上」この部分の求め方についてですが
残りのカードを種類ごとにカウントし、例えば現在のカード合計Sが30だとすると
次の素数は1~13の範囲で31,37,41,43まで、つまり1,7,11,13のカードの枚数の合計SSと
残りのカード枚数から求めています。これでいいのかは分かりません。
> このルールで全てのカードが無くなる確率はいかほどになるのか?
プログラムの結果として、並べるカードの枚数が増えるとそれだけ素数になる確率も増えるということでしょうか。
DIM CARD(52),A(13),V(52)
RANDOMIZE
LET M=10000 !'試行回数
FOR K=1 TO M
FOR I=1 TO 52
LET CARD(I)=MOD(I-1,13)+1 !'トランプ52枚
NEXT I
FOR I=1 TO 52
LET J=INT(RND*52)+1
SWAP CARD(I),CARD(J) !'カードシャッフル
NEXT I
LET S=0
LET NUM=0
LET FL=0 !'フラグリセット
FOR J=1 TO 52 !'上からカードを引いていく
LET S=S+CARD(J)
LET NUM=NUM+1
IF NUM=4 THEN !'4枚引いたら
IF ISPRIME(S)=1 THEN
LET FL=1
LET V(NUM)=V(NUM)+1
EXIT FOR
END IF
END IF
IF NUM>=4 THEN !'5枚目以降を引く前に
MAT A=ZER
FOR L=J+1 TO 52
LET A(CARD(L))=A(CARD(L))+1 !'残りのカードを種類ごとにカウント
NEXT L
LET SS=0
FOR L=1 TO 13
IF ISPRIME(S+L)=1 THEN !'次に素数となる数L
LET SS=SS+A(L) !'その数Lのカードの合計枚数
END IF
NEXT L
IF J<52 AND SS/(52-J)>=.5 THEN !'50%以上なら「戦略」を発動。カードは出さない
!' PRINT "戦略";K
LET NUM=0
LET P=P+1 !'戦略発動回数
LET S=0
ELSE
IF ISPRIME(S)=1 THEN !'素数ならループを抜ける
LET FL=1 !'フラグセット
LET V(NUM)=V(NUM)+1 !'その時のカードの枚数
EXIT FOR
END IF
END IF
END IF
NEXT J
IF FL=0 THEN LET COUNT=COUNT+1 !'カウントする
NEXT K
PRINT COUNT;COUNT/M
PRINT P
FOR I=1 TO 52
IF V(I)>0 THEN PRINT I;":";V(I)
NEXT I
END
EXTERNAL FUNCTION ISPRIME(X) !'素数か
FOR I=2 TO SQR(X)
IF MOD(X,I)=0 THEN
LET ISPRIME=0
EXIT FUNCTION
END IF
NEXT I
LET ISPRIME=1
END FUNCTION
|
|