3体問題

日常の数学・物理    ーー それでも地球はまわっている



ビンゴの確率-R


! <Wikipediaより>
! なお、通常はまったくのランダムで番号が書かれているわけではなく、
! 一番左の列は1~15の数字の中から5個選ばれている。
! 同様に、左から2列目は16~30、中央列は31~45、右から2列目は46~60、
! 一番右の列は61~75から5個ずつ(中央列のみフリースポットがあるので4個)選ばれている。

紙側も まったくのランダムで番号(1-75)が書かれている場合の結果/コードは以下のとおり。

施行回数 = 1000000回 (1000万回)   1000万回 1億回 10億回 100億回

平均回数= 41.3734846 回
1 回目| 0 回 0 % 0 %
2 回目| 0 回 0 % 0 %
3 回目| 0 回 0 % 0 %
4 回目| 44 回 .00044 % .00044 %
5 回目| 125 回 .00125 % .00169 %
6 回目| 363 回 .00363 % .00532 %
7 回目| 679 回 .00679 % .01211 %
8 回目| 1287 回 .01287 % .02498 %
9 回目| 2186 回 .02186 % .04684 %
10 回目| 3404 回 .03404 % .08088 %
11 回目| 5026 回 .05026 % .13114 %
12 回目| 6960 回 .0696 % .20074 %
13 回目| 9682 回 .09682 % .29756 %
14 回目| 12745 回 .12745 % .42501 %
15 回目| 16416 回 .16416 % .58917 %
16 回目| 21360 回 .2136 % .80277 %
17 回目| ■ 26929 回 .26929 % 1.07206 %
18 回目| ■ 33067 回 .33067 % 1.40273 %
19 回目| ■ 40070 回 .4007 % 1.80343 %
20 回目| ■ 48813 回 .48813 % 2.29156 %
21 回目| ■ 58174 回 .58174 % 2.8733 %
22 回目| ■ 68748 回 .68748 % 3.56078 %
23 回目| ■■ 80589 回 .80589 % 4.36667 %
24 回目| ■■ 93949 回 .93949 % 5.30616 %
25 回目| ■■ 108370 回 1.0837 % 6.38986 %
26 回目| ■■ 123814 回 1.23814 % 7.628 %
27 回目| ■■■ 140644 回 1.40644 % 9.03444 %
28 回目| ■■■ 158087 回 1.58087 % 10.61531 %
29 回目| ■■■■ 176241 回 1.76241 % 12.37772 %
30 回目| ■■■■ 196640 回 1.9664 % 14.34412 %
31 回目| ■■■■ 216030 回 2.1603 % 16.50442 %
32 回目| ■■■■■ 236076 回 2.36076 % 18.86518 %
33 回目| ■■■■■ 256829 回 2.56829 % 21.43347 %
34 回目| ■■■■■■ 276184 回 2.76184 % 24.19531 %
35 回目| ■■■■■■ 297068 回 2.97068 % 27.16599 %
36 回目| ■■■■■■ 316451 回 3.16451 % 30.3305 %
37 回目| ■■■■■■■ 333563 回 3.33563 % 33.66613 %
38 回目| ■■■■■■■ 349365 回 3.49365 % 37.15978 %
39 回目| ■■■■■■■ 362728 回 3.62728 % 40.78706 %
40 回目| ■■■■■■■■ 375221 回 3.75221 % 44.53927 %
41 回目| ■■■■■■■■ 383089 回 3.83089 % 48.37016 %
42 回目| ■■■■■■■■ 389882 回 3.89882 % 52.26898 %
43 回目| ■■■■■■■■ 392847 回 3.92847 % 56.19745 %
44 回目| ■■■■■■■■ 392412 回 3.92412 % 60.12157 %
45 回目| ■■■■■■■■ 386757 回 3.86757 % 63.98914 %
46 回目| ■■■■■■■■ 380252 回 3.80252 % 67.79166 %
47 回目| ■■■■■■■ 365637 回 3.65637 % 71.44803 %
48 回目| ■■■■■■■ 351956 回 3.51956 % 74.96759 %
49 回目| ■■■■■■■ 333221 回 3.33221 % 78.2998 %
50 回目| ■■■■■■ 313339 回 3.13339 % 81.43319 %
51 回目| ■■■■■■ 288996 回 2.88996 % 84.32315 %
52 回目| ■■■■■ 262772 回 2.62772 % 86.95087 %
53 回目| ■■■■■ 236089 回 2.36089 % 89.31176 %
54 回目| ■■■■ 209271 回 2.09271 % 91.40447 %
55 回目| ■■■■ 180851 回 1.80851 % 93.21298 %
56 回目| ■■■ 154276 回 1.54276 % 94.75574 %
57 回目| ■■■ 129202 回 1.29202 % 96.04776 %
58 回目| ■■ 105658 回 1.05658 % 97.10434 %
59 回目| ■■ 84015 回 .84015 % 97.94449 %
60 回目| ■ 64275 回 .64275 % 98.58724 %
61 回目| ■ 48120 回 .4812 % 99.06844 %
62 回目| ■ 34740 回 .3474 % 99.41584 %
63 回目| 24001 回 .24001 % 99.65585 %
64 回目| 15498 回 .15498 % 99.81083 %
65 回目| 9434 回 .09434 % 99.90517 %
66 回目| 5100 回 .051 % 99.95617 %
67 回目| 2705 回 .02705 % 99.98322 %
68 回目| 1170 回 .0117 % 99.99492 %
69 回目| 401 回 .00401 % 99.99893 %
70 回目| 97 回 .00097 % 99.9999 %
71 回目| 10 回 .0001 % 100 %
72 回目| 0 回 0 % 100 %
73 回目| 0 回 0 % 100 %
74 回目| 0 回 0 % 100 %
75 回目| 0 回 0 % 100 %

OPTION ARITHMETIC NATIVE  !  高速化
RANDOMIZE
DIM BING_dat(25),BING_st(25)
DIM yok(5),tat(5)
DIM NUM_FL(75) !  1~75  ナンバー既出かどうか
DIM DOSU_SUM(75)  !度数  1-75

INPUT PROMPT "施行回数=":TST ! 100  ~  1000000000

!------------------以上初期設定-------------------------------
PRINT "施行回数  ";TST              ! 開始
PRINT "開始時間  ";DATE$;" ";TIME$

LET T_HYOJI=TST/100  !  時刻表示用

FOR Q=1 TO TST
   CALL CLR_JOB !初期化処理  
    
   CALL bingo1
    
   LET DOSU_SUM(cnt0)=DOSU_SUM(cnt0)+1  !  DOSU_SUM(I) ← Iは1-75の数字
   LET SUM_cnt=cnt0+SUM_cnt    !  最後に平均回数を出すために回数の総数を積み上げている
   IF INT(Q/T_HYOJI)=(Q/T_HYOJI) THEN PRINT DATE$;" ";TIME$;Q
NEXT Q

!PRINT ""
PRINT "終了時間  ";DATE$;" ";TIME$
PRINT "平均回数=";SUM_cnt/TST;"回"


FOR I=1 TO 75 !最後にグラフ化し印字  
   LET RUI_SEKI=RUI_SEKI+DOSU_SUM(I)
   PRINT I;"回目|  ";REPEAT$("■",DOSU_SUM(I)*200/TST) ;DOSU_SUM(I);"回  ";DOSU_SUM(I)*100/TST;"% ";
   PRINT RUI_SEKI*100/TST;"%"
NEXT I

!----以下、サブプログラム------------------------------------------------
SUB bingo1
   CALL  Makesheet_RDN !  ビンゴの紙を作成する   
   FOR KKK=1 TO 100
      LET cnt0=KKK        !  
      CALL QUJI
      CALL Bingo_Hantei !  ビンゴ判定処理1
      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
    
END SUB



SUB Makesheet_RDN  !
! 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を発生させる
            LET LOTa=MOD(INT(RND*1000000),75)+1 ! ★1~75を発生させる
         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を発生させる
            LET LOTa=MOD(INT(RND*1000000),75)+1    ! ★1~75を発生させる
         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を発生させる
            LET LOTa=MOD(INT(RND*1000000),75)+1    ! ★1~75を発生させる
         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を発生させる
            LET LOTa=MOD(INT(RND*1000000),75)+1    ! ★1~75を発生させる
         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を発生させる
            LET LOTa=MOD(INT(RND*1000000),75)+1    ! ★1~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
      ELSE
         LET BING_dat(13)=0  !  13番だけは、0にしておく。
      END IF
   NEXT I
    
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


END