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


  年末年始やたら ビンゴゲーム が多いのでシミュレーションしてみる。
  正方形の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




!---------------------ビンゴ  シミュレーション----------------- <十進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


Math TOP