前のページ(ビンゴの確率)のコードでは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 %
!---------------------ビンゴ シミュレーション-----------------
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