! <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