3体問題

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



ビンゴの確率2


前のページ(ビンゴの確率)のコードでは1000万回以上の試行で、配列が大きすぎてエラーがでるため
不要な配列をなくし書直し。  又、高速化(OPTION ARITHMETIC NATIVE )を追加。

施行回数 = 100000000回 (1億回)        さらに 1000000000回試行(10億回)こちら

平均回数= 41.3670588 回

 1 回目|   0 回   0 %  0 %
 2 回目|   0 回   0 %  0 %
 3 回目|   0 回   0 %  0 %
 4 回目|   334 回   .000334 %  .000334 %
 5 回目|   1300 回   .0013 %  .001634 %
 6 回目|   3569 回   .003569 %  .005203 %
 7 回目|   7228 回   .007228 %  .012431 %
 8 回目|   13074 回   .013074 %  .025505 %
 9 回目|   21737 回   .021737 %  .047242 %
 10 回目|   33654 回   .033654 %  .080896 %
 11 回目|   48852 回   .048852 %  .129748 %
 12 回目|   69599 回   .069599 %  .199347 %
 13 回目|   95511 回   .095511 %  .294858 %
 14 回目|   126565 回   .126565 %  .421423 %
 15 回目|   165719 回   .165719 %  .587142 %
 16 回目|   211341 回   .211341 %  .798483 %
 17 回目|  ■ 265920 回   .26592 %  1.064403 %
 18 回目|  ■ 331056 回   .331056 %  1.395459 %
 19 回目|  ■ 404256 回   .404256 %  1.799715 %
 20 回目|  ■ 488855 回   .488855 %  2.28857 %
 21 回目|  ■ 583866 回   .583866 %  2.872436 %
 22 回目|  ■ 691095 回   .691095 %  3.563531 %
 23 回目|  ■■ 809962 回   .809962 %  4.373493 %
 24 回目|  ■■ 941270 回   .94127 %  5.314763 %
 25 回目|  ■■ 1085195 回   1.085195 %  6.399958 %
 26 回目|  ■■ 1238525 回   1.238525 %  7.638483 %
 27 回目|  ■■■ 1405558 回   1.405558 %  9.044041 %
 28 回目|  ■■■ 1582100 回   1.5821 %  10.626141 %
 29 回目|  ■■■■ 1767369 回   1.767369 %  12.39351 %
 30 回目|  ■■■■ 1963038 回   1.963038 %  14.356548 %
 31 回目|  ■■■■ 2163608 回   2.163608 %  16.520156 %
 32 回目|  ■■■■■ 2366499 回   2.366499 %  18.886655 %
 33 回目|  ■■■■■ 2570401 回   2.570401 %  21.457056 %
 34 回目|  ■■■■■■ 2773650 回   2.77365 %  24.230706 %
 35 回目|  ■■■■■■ 2969694 回   2.969694 %  27.2004 %
 36 回目|  ■■■■■■ 3156851 回   3.156851 %  30.357251 %
 37 回目|  ■■■■■■■ 3333800 回   3.3338 %  33.691051 %
 38 回目|  ■■■■■■■ 3496068 回   3.496068 %  37.187119 %
 39 回目|  ■■■■■■■ 3634380 回   3.63438 %  40.821499 %
 40 回目|  ■■■■■■■ 3749793 回   3.749793 %  44.571292 %
 41 回目|  ■■■■■■■■ 3837632 回   3.837632 %  48.408924 %   2人中1人あたる 平均回数= 41.3670588 回
 42 回目|  ■■■■■■■■ 3897025 回   3.897025 %  52.305949 %
 43 回目|  ■■■■■■■■ 3922619 回   3.922619 %  56.228568 %
 44 回目|  ■■■■■■■■ 3915167 回   3.915167 %  60.143735 %
 45 回目|  ■■■■■■■■ 3869039 回   3.869039 %  64.012774 %
 46 回目|  ■■■■■■■■ 3787671 回   3.787671 %  67.800445 %
 47 回目|  ■■■■■■■ 3668057 回   3.668057 %  71.468502 %
 48 回目|  ■■■■■■■ 3516098 回   3.516098 %  74.9846 %
 49 回目|  ■■■■■■■ 3335081 回   3.335081 %  78.319681 %
 50 回目|  ■■■■■■ 3121113 回   3.121113 %  81.440794 %
 51 回目|  ■■■■■■ 2885296 回   2.885296 %  84.32609 %
 52 回目|  ■■■■■ 2631032 回   2.631032 %  86.957122 %
 53 回目|  ■■■■■ 2362696 回   2.362696 %  89.319818 %
 54 回目|  ■■■■ 2089364 回   2.089364 %  91.409182 %
 55 回目|  ■■■■ 1815688 回   1.815688 %  93.22487 %
 56 回目|  ■■■ 1545782 回   1.545782 %  94.770652 %
 57 回目|  ■■■ 1290764 回   1.290764 %  96.061416 %
 58 回目|  ■■ 1051559 回   1.051559 %  97.112975 %
 59 回目|  ■■ 835657 回   .835657 %  97.948632 %
 60 回目|  ■ 645028 回   .645028 %  98.59366 %
 61 回目|  ■ 480845 回   .480845 %  99.074505 %
 62 回目|  ■ 345236 回   .345236 %  99.419741 %
 63 回目|   236422 回   .236422 %  99.656163 %
 64 回目|   153926 回   .153926 %  99.810089 %
 65 回目|   93859 回   .093859 %  99.903948 %
 66 回目|   52398 回   .052398 %  99.956346 %
 67 回目|   26697 回   .026697 %  99.983043 %
 68 回目|   11673 回   .011673 %  99.994716 %
 69 回目|   4131 回   .004131 %  99.998847 %
 70 回目|   1004 回   .001004 %  99.999851 %
 71 回目|   149 回   .000149 %  100 %
 72 回目|   0 回   0 %  100 %
 73 回目|   0 回   0 %  100 %
 74 回目|   0 回   0 %  100 %
 75 回目|   0 回   0 %  100 %

十進BASIC

!---------------------ビンゴ  シミュレーション-----------------
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 !  ビンゴの紙を作成する   
   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  !
! 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
      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