十進BASICのプログラムについて

 投稿者:ド素人メール  投稿日:2008年12月11日(木)11時59分5秒
  十進BASICで擬似乱数を使ったプログラムを作成したいと思っています。打率のデータを基に、どういう打順を組めば効率よく点が取れるのかを、乱数を発生させて作りたいのですが、どうしたらいいでしょうか?  

Re: 十進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
 

Re: 十進BASICのプログラムについて

 投稿者:ド素人メール  投稿日:2008年12月15日(月)16時11分49秒
  > No.155[元記事へ]

山中和義さんへのお返事です。

素早いお返事ありがとうございます。とても助かりました。またわからないことがあったら投稿させていただきます。
 

Re: 十進BASICのプログラムについて

 投稿者:荒田浩二  投稿日: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 点
 

Re: 十進BASICのプログラムについて

 投稿者:ド素人メール  投稿日:2008年12月17日(水)15時02分48秒
  > No.155[元記事へ]

山中和義さんへのお返事です。

丁寧にプログラムを掲載していただきありがとうございます。
ひとつ質問があるのですが、「1試合ごとの内訳は、PRINT文の注釈を削除すれば表示されます。」と書いてある部分は、具体的にはどの部分のことをさしているのでしょうか?1試合ごとの内訳を知りたいのでぜひ教えていただけないでしょうか?よろしくお願いします。
 

Re: 十進BASICのプログラムについて

 投稿者:山中和義  投稿日: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
 

Re: 十進BASICのプログラムについて

 投稿者:ド素人メール  投稿日:2008年12月17日(水)15時52分47秒
  > No.155[元記事へ]

山中和義さんへのお返事です。

たびたびすみません。DATAの次の行に書いてある!DATAはどのような意味があるのでしょうか?ここにはどのようなデータを書き込めばいいのでしょうか?無くても問題はないのでしょうか?
 

Re: 十進BASICのプログラムについて

 投稿者:山中和義  投稿日:2008年12月17日(水)16時23分21秒
  > No.166[元記事へ]

ド素人さんへのお返事です。

> DATAの次の行に書いてある!DATAはどのような意味があるのでしょうか?ここにはどのようなデータを書き込めばいいのでしょうか?無くても問題はないのでしょうか?


感嘆符から始まる行ですから、この行全体は注釈すなわち「実行されない文」となります。
したがって、あっても無くても問題になりません。


この注釈行を変更することで、別のパターンがすばやく確認できます。(メモも兼ねる)



DATA パターン1 <---- ここが実行される
!DATA パターン2
!DATA パターン3



!DATA パターン1
DATA パターン2  <---- ここが実行される
!DATA パターン3

と変更して、プログラムを実行する。
 

戻る