生活の中のシミュレーション

◆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億年

★100人以外の場合の結果



! 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


Math TOP