投稿者:ド素人
投稿日:2008年12月11日(木)11時59分5秒
|
|
|
十進BASICで擬似乱数を使ったプログラムを作成したいと思っています。打率のデータを基に、どういう打順を組めば効率よく点が取れるのかを、乱数を発生させて作りたいのですが、どうしたらいいでしょうか?
|
|
|
投稿者:山中和義
投稿日:2008年12月11日(木)19時54分8秒
|
|
|
> No.154[元記事へ]
ド素人さんへのお返事です。
打った、送ったの単純で、5000試合の平均を表示します。
1試合ごとの内訳は、PRINT文の注釈を削除すれば表示されます。
ただし、5000回試合の表示には時間がかかります。(実用的でない)
!打順考察のためのシミュレーション
DATA 0.2, 0.2, 0.3, 0.3, 0.3, 0.2, 0.2, 0.1, 0.1
!DATA 0.1, 0.2, 0.2, 0.3, 0.2, 0.1, 0.3, 0.2, 0.3
!DATA 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2
DIM D(9) !9人分の打率
MAT READ D
RANDOMIZE
LET N=5000 !試合数
FOR x=1 TO N
DIM SM(N) !総合得点
LET P=1 !打順
FOR w=1 TO 9 !9回まで
LET B=0 !塁の状態
LET S1=0 !得点
LET O=0
DO UNTIL O=3 !3アウトまで
!PRINT P;"番打者:";
IF RND<D(P) THEN !ヒットなら
LET t=INT(RND*10)+1 !長打率など ※1~10
SELECT CASE t
CASE 1,2,3,4
LET v=1
CASE 5,6,7
LET v=2
CASE 8,9
LET v=3
CASE ELSE
LET v=4
END SELECT
!PRINT v;"塁打", !1~4
LET B=B*10+1 !v塁打で走者を送る
LET S1=S1+INT(B/10^3)
LET B=MOD(B,10^3)
FOR i=0 TO v-2
LET B=B*10
LET S1=S1+INT(B/10^3)
LET B=MOD(B,10^3)
NEXT i
ELSE
LET O=O+1
!PRINT "アウト",
END IF
!PRINT USING "# %%%": S1,B !塁の状態
LET P=P+1 !次へ
IF P>9 THEN LET P=1
LOOP
!PRINT w;"回";S1;"点"
!PRINT
LET SM(w)=SM(w)+S1
NEXT w
NEXT x
LET S=0 !得点の分布
FOR w=1 TO 9
PRINT w;"回";SM(w)/N;"点"
LET S=S+SM(w)
NEXT w
PRINT "総合得点=";S/N
END
|
|
|
投稿者:ド素人
投稿日:2008年12月15日(月)16時11分49秒
|
|
|
> No.155[元記事へ]
山中和義さんへのお返事です。
素早いお返事ありがとうございます。とても助かりました。またわからないことがあったら投稿させていただきます。
|
|
|
投稿者:荒田浩二
投稿日:2008年12月16日(火)12時15分34秒
|
|
|
> No.154[元記事へ]
ド素人さんへのお返事です。
9人での打順は 9!=362880通りありますが、各打順ごとに1000試合をシミュレートしました。
試合のシミュレーションは単純にヒット3本で1点、以下ヒット1本ごとに1点追加。
実行には2進モードで約2時間20分かかりました。
ただし1000試合では試行回数が少なく、とくに各打者の打率のバラつきが小さいときは結果の信頼性は低いと思います。
上位100位を出力しましたが、あくまでも傾向を知るていどだと承知して下さい。
DECLARE EXTERNAL SUB perm
PUBLIC NUMERIC player,games,rank,total_point,worst_point
PUBLIC NUMERIC ave(9),best_order(100,9),best_point(100)
PRINT TIME$
LET t=TIME
LET player=9 ! 9!=362880通り
LET games=1000 ! 試合数
LET rank=100 ! ランク
MAT READ ave
DATA .460,.420,.380,.340,.300,.260,.220,.180,.140
!DATA .380,.360,.340,.320,.300,.280,.260,.240,.220
DIM a(player)
FOR i=1 TO player
LET a(i)=i
NEXT i
MAT best_order=ZER
MAT best_point=ZER
LET total_point=0
LET worst_point=10*games
CALL perm(a,1)
FOR i=1 TO rank
PRINT USING "No## 打順" : i;
FOR j=1 TO player
PRINT best_order(i,j);
NEXT j
PRINT USING " 期待値-%.### 点":best_point(i)/games
NEXT i
PRINT "最低期待値 =";worst_point/games;"点"
PRINT "平均 =";total_point/(games*FACT(player));"点"
PRINT TIME-t;"sec"
END
EXTERNAL SUB simulation(order())
LET sum_point=0
FOR i=1 TO games
LET at_bat=0
FOR inning=1 TO 9 ! 9回
LET out_count=0
LET hit=0
DO
IF ave(order(MOD(at_bat,player)+1))>RND THEN
LET hit=hit+1
IF hit>=3 THEN LET sum_point=sum_point+1
ELSE
LET out_count=out_count+1
END IF
LET at_bat=at_bat+1
LOOP UNTIL out_count=3
NEXT inning
NEXT i
LET total_point=total_point+sum_point
IF sum_point>best_point(rank) THEN ! ランク付け
LET best_point(rank)=sum_point
FOR j=1 TO player
LET best_order(rank,j)=order(j)
NEXT j
FOR i=rank TO 2 STEP -1
IF best_point(i)>best_point(i-1) THEN
SWAP best_point(i),best_point(i-1)
FOR j=1 TO player
SWAP best_order(i,j),best_order(i-1,j)
NEXT j
ELSE
EXIT SUB
END IF
NEXT i
ELSEIF sum_point<worst_point THEN
LET worst_point=sum_point
END IF
END SUB
REM 十進BASIC添付"\BASICw32\SAMPLE\PERMUTAT.BAS"より
REM 1~nの順列を辞書式順序で生成する。
EXTERNAL SUB perm(a(),n)
DECLARE EXTERNAL SUB simulation
IF n=player THEN
CALL simulation(a)
ELSE
FOR i=n TO player
LET t=a(i)
FOR j=i-1 TO n STEP -1
LET a(j+1)=a(j)
NEXT j
LET a(n)=t
CALL perm(a,n+1)
LET t=a(n)
FOR j=n TO i-1
LET a(j)=a(j+1)
NEXT j
LET a(i)=t
NEXT i
END IF
END SUB
No 1 打順 2 1 3 4 6 5 7 9 8 期待値 2.952 点
No 2 打順 3 4 1 2 5 6 9 8 7 期待値 2.914 点
No 3 打順 4 3 5 1 2 6 8 7 9 期待値 2.905 点
No 4 打順 6 3 4 1 2 5 9 8 7 期待値 2.902 点
No 5 打順 7 6 3 2 1 5 4 8 9 期待値 2.895 点
No 6 打順 3 1 2 4 5 6 7 9 8 期待値 2.889 点
No 7 打順 1 5 4 3 2 6 9 8 7 期待値 2.880 点
No 8 打順 4 1 3 2 5 6 8 9 7 期待値 2.879 点
No 9 打順 4 2 3 1 5 6 8 9 7 期待値 2.879 点
No10 打順 6 5 3 1 2 4 7 8 9 期待値 2.879 点
No11 打順 2 5 4 1 3 6 7 9 8 期待値 2.878 点
No12 打順 4 2 5 1 3 6 9 8 7 期待値 2.875 点
No13 打順 1 2 5 4 3 7 6 9 8 期待値 2.871 点
No14 打順 5 3 4 2 1 6 7 9 8 期待値 2.870 点
No15 打順 5 4 2 1 3 9 7 8 6 期待値 2.869 点
No16 打順 2 1 3 4 5 6 7 9 8 期待値 2.867 点
No17 打順 4 2 3 1 5 6 9 8 7 期待値 2.865 点
No18 打順 5 1 3 4 2 6 7 8 9 期待値 2.865 点
No19 打順 2 3 4 5 1 7 6 8 9 期待値 2.864 点
No20 打順 6 2 4 3 1 5 9 8 7 期待値 2.864 点
No21 打順 3 6 4 1 2 8 9 5 7 期待値 2.863 点
No22 打順 5 4 2 1 3 6 7 9 8 期待値 2.862 点
No23 打順 6 2 1 4 3 7 9 5 8 期待値 2.861 点
No24 打順 7 5 3 1 2 4 6 8 9 期待値 2.861 点
No25 打順 3 1 2 5 4 6 7 9 8 期待値 2.860 点
No26 打順 2 1 5 4 9 8 7 6 3 期待値 2.859 点
No27 打順 2 3 1 4 5 6 8 9 7 期待値 2.858 点
No28 打順 7 3 4 1 2 9 8 5 6 期待値 2.857 点
No29 打順 2 4 1 3 5 7 6 8 9 期待値 2.856 点
No30 打順 9 5 4 1 3 2 6 7 8 期待値 2.856 点
No31 打順 2 1 5 3 4 7 6 9 8 期待値 2.853 点
No32 打順 4 1 3 5 2 6 7 9 8 期待値 2.852 点
No33 打順 4 1 5 3 2 9 7 8 6 期待値 2.852 点
No34 打順 4 5 3 2 1 6 9 8 7 期待値 2.852 点
No35 打順 2 5 1 4 3 6 9 7 8 期待値 2.851 点
No36 打順 3 4 2 1 7 6 9 5 8 期待値 2.850 点
No37 打順 5 3 4 2 1 6 9 8 7 期待値 2.850 点
No38 打順 2 3 1 4 5 6 9 8 7 期待値 2.849 点
No39 打順 4 2 3 5 1 6 7 9 8 期待値 2.849 点
No40 打順 2 4 1 5 3 7 9 8 6 期待値 2.848 点
No41 打順 5 7 4 1 3 2 8 9 6 期待値 2.847 点
No42 打順 2 4 1 5 3 7 8 9 6 期待値 2.846 点
No43 打順 4 3 2 1 5 7 8 9 6 期待値 2.845 点
No44 打順 1 4 2 3 8 7 9 5 6 期待値 2.844 点
No45 打順 4 3 1 2 5 6 9 7 8 期待値 2.844 点
No46 打順 7 3 2 1 4 5 6 9 8 期待値 2.844 点
No47 打順 4 2 3 1 5 9 7 8 6 期待値 2.843 点
No48 打順 5 2 3 1 4 6 8 7 9 期待値 2.843 点
No49 打順 5 3 2 4 1 7 6 8 9 期待値 2.842 点
No50 打順 2 1 4 3 5 8 6 7 9 期待値 2.841 点
No51 打順 4 6 3 1 2 8 5 9 7 期待値 2.841 点
No52 打順 5 4 1 2 3 9 8 7 6 期待値 2.841 点
No53 打順 2 4 3 1 5 8 9 6 7 期待値 2.840 点
No54 打順 3 2 1 4 5 8 9 7 6 期待値 2.840 点
No55 打順 9 2 3 4 1 5 6 7 8 期待値 2.839 点
No56 打順 6 5 2 1 4 3 8 9 7 期待値 2.838 点
No57 打順 7 3 6 1 2 4 5 8 9 期待値 2.838 点
No58 打順 3 5 7 2 1 4 6 8 9 期待値 2.837 点
No59 打順 4 3 1 2 7 5 8 9 6 期待値 2.837 点
No60 打順 4 6 2 3 1 5 7 8 9 期待値 2.837 点
No61 打順 4 6 3 2 1 5 8 9 7 期待値 2.837 点
No62 打順 6 1 2 4 3 8 5 9 7 期待値 2.837 点
No63 打順 2 4 3 1 5 8 6 9 7 期待値 2.836 点
No64 打順 4 3 5 2 1 6 9 8 7 期待値 2.836 点
No65 打順 4 5 1 2 3 6 7 9 8 期待値 2.836 点
No66 打順 1 4 3 5 6 8 9 7 2 期待値 2.835 点
No67 打順 4 3 1 2 5 6 9 8 7 期待値 2.835 点
No68 打順 4 6 1 2 3 5 8 9 7 期待値 2.835 点
No69 打順 5 4 1 3 6 9 8 7 2 期待値 2.835 点
No70 打順 6 3 4 1 2 7 5 8 9 期待値 2.835 点
No71 打順 1 3 2 4 6 9 8 5 7 期待値 2.834 点
No72 打順 3 2 1 4 6 7 5 8 9 期待値 2.834 点
No73 打順 4 1 3 2 5 6 7 8 9 期待値 2.834 点
No74 打順 6 5 3 4 1 2 7 8 9 期待値 2.834 点
No75 打順 7 4 5 1 2 3 6 9 8 期待値 2.834 点
No76 打順 3 1 2 6 5 4 7 8 9 期待値 2.833 点
No77 打順 6 1 2 3 4 5 8 9 7 期待値 2.833 点
No78 打順 6 3 1 2 5 4 9 7 8 期待値 2.833 点
No79 打順 7 3 6 1 2 5 4 8 9 期待値 2.833 点
No80 打順 5 2 3 1 4 7 8 9 6 期待値 2.832 点
No81 打順 7 4 5 3 1 2 6 8 9 期待値 2.832 点
No82 打順 3 1 2 7 4 6 9 8 5 期待値 2.831 点
No83 打順 3 1 4 2 7 8 9 6 5 期待値 2.831 点
No84 打順 3 2 1 4 5 7 9 8 6 期待値 2.831 点
No85 打順 5 3 1 2 4 6 9 7 8 期待値 2.831 点
No86 打順 5 6 1 2 4 3 7 8 9 期待値 2.831 点
No87 打順 6 3 4 1 2 7 5 9 8 期待値 2.831 点
No88 打順 1 2 3 5 4 9 7 8 6 期待値 2.830 点
No89 打順 2 5 1 3 4 7 9 8 6 期待値 2.830 点
No90 打順 6 5 3 1 4 2 7 9 8 期待値 2.830 点
No91 打順 6 9 3 4 2 1 5 7 8 期待値 2.830 点
No92 打順 2 1 4 5 7 9 8 6 3 期待値 2.829 点
No93 打順 5 1 4 3 2 7 9 8 6 期待値 2.829 点
No94 打順 8 5 1 4 2 3 6 9 7 期待値 2.829 点
No95 打順 1 2 3 4 6 9 8 7 5 期待値 2.828 点
No96 打順 3 4 1 2 6 7 9 5 8 期待値 2.828 点
No97 打順 1 3 5 2 4 6 7 8 9 期待値 2.827 点
No98 打順 2 1 3 5 4 7 9 8 6 期待値 2.827 点
No99 打順 3 4 1 2 5 6 7 9 8 期待値 2.826 点
No100 打順 4 2 1 3 5 8 9 7 6 期待値 2.826 点
最低期待値 = 2.073 点
平均 = 2.44374 点
|
|
|
投稿者:ド素人
投稿日:2008年12月17日(水)15時02分48秒
|
|
|
> No.155[元記事へ]
山中和義さんへのお返事です。
丁寧にプログラムを掲載していただきありがとうございます。
ひとつ質問があるのですが、「1試合ごとの内訳は、PRINT文の注釈を削除すれば表示されます。」と書いてある部分は、具体的にはどの部分のことをさしているのでしょうか?1試合ごとの内訳を知りたいのでぜひ教えていただけないでしょうか?よろしくお願いします。
|
|
|
投稿者:山中和義
投稿日:2008年12月17日(水)15時42分26秒
|
|
|
> No.164[元記事へ]
ド素人さんへのお返事です。
> ひとつ質問があるのですが、「1試合ごとの内訳は、PRINT文の注釈を削除すれば表示されます。」と書いてある部分は、具体的にはどの部分のことをさしているのでしょうか?
!PRINT ~ の形の部分です。十進BASICの注釈(コメント)は感嘆符(!マーク)です。
下記に削除したプログラムを掲載しておきます。
!打順考察のためのシミュレーション
DATA 0.2, 0.2, 0.3, 0.3, 0.3, 0.2, 0.2, 0.1, 0.1
!DATA 0.1, 0.2, 0.2, 0.3, 0.2, 0.1, 0.3, 0.2, 0.3
!DATA 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2
DIM D(9) !9人分の打率
MAT READ D
RANDOMIZE
LET N=10 !試合数 ※調整要
FOR x=1 TO N
PRINT !<----- ここ
PRINT "***";x;"試合目 ***" !<----- ここ
DIM SM(N) !総合得点
LET P=1 !打順
FOR w=1 TO 9 !9回まで
LET B=0 !塁の状態
LET S1=0 !得点
LET O=0
DO UNTIL O=3 !3アウトまで
PRINT P;"番打者:"; !<----- ここ
IF RND<D(P) THEN !ヒットなら
LET t=INT(RND*10)+1 !長打率など ※1~10
SELECT CASE t
CASE 1,2,3,4
LET v=1
CASE 5,6,7
LET v=2
CASE 8,9
LET v=3
CASE ELSE
LET v=4
END SELECT
PRINT v;"塁打", !1~4 <----- ここ
LET B=B*10+1 !v塁打で走者を送る
LET S1=S1+INT(B/10^3)
LET B=MOD(B,10^3)
FOR i=0 TO v-2
LET B=B*10
LET S1=S1+INT(B/10^3)
LET B=MOD(B,10^3)
NEXT i
ELSE
LET O=O+1
PRINT "アウト", !<----- ここ
END IF
PRINT USING "# %%%": S1,B !塁の状態 <----- ここ
LET P=P+1 !次へ
IF P>9 THEN LET P=1
LOOP
PRINT w;"回";S1;"点" !<----- ここ
PRINT !<----- ここ
LET SM(w)=SM(w)+S1
NEXT w
NEXT x
PRINT
LET S=0 !得点の分布
FOR w=1 TO 9
PRINT w;"回";SM(w)/N;"点"
LET S=S+SM(w)
NEXT w
PRINT "総合得点=";S/N
END
|
|
|
投稿者:ド素人
投稿日:2008年12月17日(水)15時52分47秒
|
|
|
> No.155[元記事へ]
山中和義さんへのお返事です。
たびたびすみません。DATAの次の行に書いてある!DATAはどのような意味があるのでしょうか?ここにはどのようなデータを書き込めばいいのでしょうか?無くても問題はないのでしょうか?
|
|
|
投稿者:山中和義
投稿日:2008年12月17日(水)16時23分21秒
|
|
|
> No.166[元記事へ]
ド素人さんへのお返事です。
> DATAの次の行に書いてある!DATAはどのような意味があるのでしょうか?ここにはどのようなデータを書き込めばいいのでしょうか?無くても問題はないのでしょうか?
感嘆符から始まる行ですから、この行全体は注釈すなわち「実行されない文」となります。
したがって、あっても無くても問題になりません。
この注釈行を変更することで、別のパターンがすばやく確認できます。(メモも兼ねる)
例
DATA パターン1 <---- ここが実行される
!DATA パターン2
!DATA パターン3
を
!DATA パターン1
DATA パターン2 <---- ここが実行される
!DATA パターン3
と変更して、プログラムを実行する。
|
|
|
戻る