年末年始やたら ビンゴゲームが多いのでシミュレーションしてみる。
正方形の5×5のマスに 1~75 までの数字が書かれている。
<Wikipediaより>
なお、通常はまったくのランダムで番号が書かれているわけではなく、
一番左の列は1~15の数字の中から5個選ばれている。
同様に、左から2列目は16~30、中央列は31~45、右から2列目は46~60、
一番右の列は61~75から5個ずつ(中央列のみフリースポットがあるので4個)選ばれている。
平均どのくらいの回数であたるのか? ・・・ 結果:約41.4回目 1000万回試行の結果
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 |
!---------------------ビンゴ シミュレーション----------------- <十進BASIC>
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