生活の中のシミュレーション
◆100人でじゃんけんしたら、何時間くらいかかるんだろう?
但し、1回 3秒かかるとする。
<答え> 128億年
■シミュレーション結果
パソコン上で計算してもいつまでも、あいこを続けるので
おかしいな? と思ったら、
最初の決着がつく期待値は、なんと
1.355×10^17回。
1÷(3×((2/3)^100-(1/3)^100-(1/3)^100)≒1.355×10^17回
-->(×3秒/回)-->4.06×10^17秒≒128億年
! N人のじゃんけんで何回で決着が付くか?
! シミュレーションをする
RANDOMIZE
INPUT PROMPT
"何人で=":N
LET SYOKI_N=N
DIM JNK(N),S(N)
CALL SYOKI ! 初期化
CALL
NOKORI_NIN
DO
DO
LET AIKO=0
CALL JK_poi
CALL AIKO1
IF
ZANNIN=>3 THEN CALL AIKO2 !グー・チョキ・パーであいこの場合
IF AIK_ALL=1 OR AIK3=1
THEN
LET AIKO=1
LET CNT=CNT+1
END if
LOOP UNTIL AIKO=0
!あいこの間AIKO=1は、LOOPする
CALL SYOU_HI
CALL NOKORI_NIN
LOOP
UNTIL ZANNIN<=1 !残り1以下でない場合は、LOOPする
PRINT "終了! ";SYOKI_N;"人がじゃんけんして
";CNT;"回で決着"
!---------サブルーチン----------------------------------
SUB
NOKORI_NIN
LET ZANNIN=0
FOR I=1 TO N
IF S(I)=1 THEN LET
ZANNIN=ZANNIN+1
NEXT I
PRINT "残り=";ZANNIN;"人"
END SUB
SUB
SYOU_HI
! PRINT "勝った!! ";
LET CNT=CNT+1
LET GU=0
LET CYK=0
LET
PA=0
FOR I=1 TO N
IF S(I)=1 AND JNK(I)=1 THEN LET GU=1
IF S(I)=1 AND
JNK(I)=2 THEN LET CYK=1
IF S(I)=1 AND JNK(I)=3 THEN LET PA=1
NEXT
I
IF PA=0 THEN CALL GU_CYOKI
IF GU=0 THEN CALL CYOKI_P
IF CYK=0
THEN CALL P_GU
END SUB
SUB GU_CYOKI
FOR I=1 TO N
IF JNK(I)=2
AND S(I)=1 THEN LET S(I)=0
NEXT I
END SUB
SUB CYOKI_P
FOR I=1 TO
N
IF JNK(I)=3 AND S(I)=1 THEN LET S(I)=0
NEXT I
END SUB
SUB
P_GU
FOR I=1 TO N
IF JNK(I)=1 AND S(I)=1 THEN LET S(I)=0
NEXT I
END
SUB
!残った人でじゃんけんし、全員同じか判定する 全員同じなら1を立てる
SUB AIKO1
LET
AIK_ALL=1
FOR I=1 TO N
IF S(I)=1 THEN
LET AIK_HT=JNK(I)
EXIT
FOR
END IF
NEXT I
FOR I=1 TO N
IF ZANNIN>1 AND S(I)=1 AND
AIK_HT<>JNK(I) THEN LET AIK_ALL=0
IF ZANNIN=1 THEN LET
AIK_ALL=0
NEXT I
IF AIK_ALL=1 AND AIK_HT=1 THEN PRINT "みんな ぐー"
IF
AIK_ALL=1 AND AIK_HT=2 THEN PRINT "みんな チョキ"
IF AIK_ALL=1 AND AIK_HT=3 THEN
PRINT "みんな パー"
END SUB
SUB AIKO2
!残った人でじゃんけんし、グー、チョキ、パーが全部でていれば1をたてる
LET GU=0
LET CYK=0
LET PA=0
LET
AIK3=0
FOR I=1 TO N
IF S(I)=1 AND JNK(I)=1 THEN LET GU=1
IF S(I)=1 AND
JNK(I)=2 THEN LET CYK=1
IF S(I)=1 AND JNK(I)=3 THEN LET PA=1
NEXT I
IF
GU=1 AND CYK=1 AND PA=1 THEN
! PRINT "あいこでしょ!!"
LET AIK3=1
END
IF
END SUB
SUB JK_poi
PRINT "じゃんけん ぽい! ";
FOR I=1 TO N
IF
S(I)=1 THEN
LET JNK(I)=MOD(INT(100000*RND),3)+1 !1,2,3を発生させる
END
IF
NEXT I
LET CNT_GU=0
LET CNT_CYK=0
LET CNT_P=0
FOR I=1 TO
N
IF S(I)=1 AND JNK(I)=1 THEN LET CNT_GU=CNT_GU+1
IF S(I)=1 AND JNK(I)=2
THEN LET CNT_CYK=CNT_CYK+1
IF S(I)=1 AND JNK(I)=3 THEN LET
CNT_P=CNT_P+1
NEXT I
PRINT
" グー ";CNT_GU;"人";" チョキ ";CNT_CYK;"人";" パー ";CNT_P;"人";" 計";CNT_GU+CNT_CYK+CNT_P;"人 ";CNT+1;"回目"
END
SUB
SUB SYOKI
FOR I=1 TO N
LET S(I)=1
NEXT I
END
SUB
END