生活の中のシミュレーション
年末年始やたら ビンゴゲーム
が多いのでシミュレーションしてみる。
正方形の5×5のマスに 1〜75 までの数字が書かれている。
<Wikipediaより>
なお、通常はまったくのランダムで番号が書かれているわけではなく、
一番左の列は1〜15の数字の中から5個選ばれている。
同様に、左から2列目は16〜30、中央列は31〜45、右から2列目は46〜60、
一番右の列は61〜75から5個ずつ(中央列のみフリースポットがあるので4個)選ばれている。
平均どのくらいの回数であたるのか? ・・・ 結果:約41.4回目
BINGO!
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
● |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
RANDOMIZE
DIM BING_dat(25),BING_st(25)
DIM
yok(5),tat(5)
DIM NUM_FL(75) ! 1〜75 ナンバー既出かどうか
DIM
cnt(100000)
LET TST=1 !
試行回数
!------------------以上初期設定-----------------------------
CALL CLR_JOB !初期化処理
CALL bingo1
!----以下、サブプログラム----
SUB bingo1
CALL
Makesheet ! ビンゴの紙を作成する
FOR KKK=1 TO
100
LET
cnt0=KKK
PRINT
KKK;"回目--------"
CALL
QUJI
CALL Bingo_Hantei !
ビンゴ判定処理1
CALL Bigo_end_PRT !
ビンゴ終了処理
IF BING_CLR=1
THEN
EXIT
FOR
END IF
NEXT KKK
END
SUB
SUB Bingo_Hantei ! ビンゴの判定
FOR L=1 TO 5 !
行状態
LET
L2=(L-1)*5
LET
yok(L)=BING_st(L2+1)+BING_st(L2+2)+BING_st(L2+3)+BING_st(L2+4)+BING_st(L2+5)
NEXT L
FOR L=1 TO 5 !
列状態
LET
tat(L)=BING_st(L+0)+BING_st(L+5)+BING_st(L+10)+BING_st(L+15)+BING_st(L+20)
NEXT L
!
ななめ状態
LET
nan1=BING_st(1)+BING_st(7)+BING_st(13)+BING_st(19)+BING_st(25)
LET
nan2=BING_st(5)+BING_st(9)+BING_st(13)+BING_st(17)+BING_st(21)
FOR LLL=1 TO 5 ! 状態判定
IF yok(LLL)=5 OR tat(LLL)=5 OR nan1=5 OR nan2=5
THEN
LET
BING_CLR=1
END IF
NEXT
LLL
END SUB
SUB QUJI
DO !
1〜75でこれまでに出ていない数字を乱数で出す
LET
lot75=MOD(INT(RND*1000000),75)+1 ! 1〜75を発生させる
LOOP UNTIL
NUM_FL(lot75)=0
LET NUM_FL(lot75)=1
!出た数字は、フラグを立てる
PRINT
lot75;"が出た−"
LET STRK=0
FOR I=1 TO
25
IF BING_dat(I)=lot75
THEN
PRINT
I;"番目のマスが当たった!"
LET
BING_st(I)=1
LET
STRK=1
END IF
NEXT
I
IF STRK=0
THEN
PRINT "--ハズレ--"
END
IF
CALL PRT_SQ
END SUB
SUB PRT_SQ ! 状態表示
FOR I=1 TO
25
IF BING_st(I)=1 THEN
PRINT
"●";
ELSE
PRINT
"□";
END
IF
IF
I=5 OR I=10 OR I=15 OR I=20 OR I=25 THEN
PRINT
""
END IF
IF
I=25 THEN
PRINT
""
END IF
NEXT I
END
SUB
SUB Makesheet !
PRINT "□□□□□□□□
紙側データの作成 □□□□□□□□□"
!
<Wikipediaより>
!
なお、通常はまったくのランダムで番号が書かれているわけではなく、
!
一番左の列は1〜15の数字の中から5個選ばれている。
!
同様に、左から2列目は16〜30、中央列は31〜45、右から2列目は46〜60、
!
一番右の列は61〜75から5個ずつ(中央列のみフリースポットがあるので4個)選ばれている。
FOR I=1 TO 25
DO
LET
FL=0
IF I=1 OR I=6 OR I=11
OR I=16 OR I=21 THEN !最左列
LET
LOTa=MOD(INT(RND*1000000),15)+1 !
1〜15を発生させる
END
IF
IF I=2 OR I=7 OR I=12 OR
I=17 OR I=22 THEN !第2列
LET
LOTa=MOD(INT(RND*1000000),15)+1+15 !
16〜30を発生させる
END
IF
IF I=3 OR I=8 OR I=13 OR
I=18 OR I=23 THEN !第3列
LET
LOTa=MOD(INT(RND*1000000),15)+1+30 !
31〜45を発生させる
END
IF
IF I=4 OR I=9 OR I=14 OR
I=19 OR I=24 THEN !第4列
LET
LOTa=MOD(INT(RND*1000000),15)+1+45 !
46〜60を発生させる
END
IF
IF I=5 OR I=10 OR I=15 OR
I=20 OR I=25 THEN !第5列
LET
LOTa=MOD(INT(RND*1000000),15)+1+60 !
61〜75を発生させる
END
IF
FOR JJJ=1 TO I-1
IF
BING_dat(JJJ)=LOTa
THEN
LET FL=1
END
IF
NEXT
JJJ
LOOP UNTIL FL=0
!前のデータと重複していたら再度やり直し
LET
BING_dat(I)=LOTa
IF I<>13
THEN
PRINT
I;"番マス "; BING_dat(I)
ELSE
LET
BING_dat(13)=0 !
13番だけは、0にしておく。
PRINT
I;"番マス "; BING_dat(13)
END
IF
NEXT I
PRINT "□□□□□□□□□ データ作成/完了
□□□□□□□□□□"
PRINT ""
END SUB
SUB CLR_JOB
FOR I=1 TO
75
IF I=<25
THEN
LET
BING_dat(I)=0
LET
BING_st(I)=0
END
IF
IF I=<5
THEN
LET
yok(I)=0
LET
tat(I)=0
END
IF
LET NUM_FL(I)=0
NEXT I
LET
BING_st(13)=1
LET nan1=0
LET
nan2=0
LET BING_CLR=0
LET L2=0
LET STRK=0
LET lot75=0
LET LOTa=0
END
SUB
SUB Bigo_end_PRT
IF BING_CLR=1 THEN
PRINT "●●● ビンゴ!!
ビンゴ!! ビンゴ!! ●●● "
END IF
END
SUB
END