|
> No.148[元記事へ]
GAIさんへのお返事です。
10万回の実験ではDとWがわずかに有利とでました。
期待値の1.324とは、1回に1000円かけると平均1324円戻ってくるという意味です。
下のプログラムでは対戦人数を2~4人に指定できます。
ただし全員違うサイコロを選択するとします。
3人、4人ではAとYが有利とでました。
理論値を求めるのもそれほど難しくはないと思いますが、どうでしょう?
DECLARE EXTERNAL SUB combination
LET k=100000 ! 対戦回数
LET p=2 ! パターン
LET n=4 ! サイコロの種類
LET f=6 ! サイコロの面数
INPUT PROMPT "対戦人数は? " : r
IF r<2 OR r>n THEN STOP
DIM code$(p,n),dice(p,n,f),d(r),win(r),sumwin(p,n),a(n),com(COMB(n,r),r)
MAT READ code$,dice
MAT a=ZER(n)
MAT sumwin=ZER
LET total=(COMB(n,r)-COMB(n-1,r))*k
LET count=0 ! COMB(n,r)
CALL combination(a,n,1,r,com,count)
FOR pp=1 TO p
FOR i=1 TO count
MAT win=ZER
FOR j=1 TO k
LET maxd=-1
FOR ri=1 TO r
LET d(ri)=dice(pp,com(i,ri),INT(f*RND)+1)
IF d(ri)>maxd THEN
LET maxd=d(ri)
LET w=ri
ELSEIF d(ri)=maxd THEN ! 引き分け
LET w=0
END IF
NEXT ri
IF w=0 THEN LET j=j-1 ELSE LET win(w)=win(w)+1
NEXT j
LET maxw=0
FOR ri=1 TO r
LET sumwin(pp,com(i,ri))=sumwin(pp,com(i,ri))+win(ri)
PRINT code$(pp,com(i,ri));win(ri);" ";
IF win(ri)>maxw THEN
LET w=ri
LET maxw=win(ri)
END IF
NEXT ri
PRINT "勝者 ";code$(pp,com(i,w));win(w);"勝";k-win(w);"敗";
PRINT USING " 期待値 #.####":r*win(w)/k
NEXT i
PRINT "総合勝敗"
FOR ni=1 TO n
PRINT code$(pp,ni);sumwin(pp,ni);"勝";total-sumwin(pp,ni);"敗";
PRINT USING " 期待値 #.####":r*sumwin(pp,ni)/total
NEXT ni
PRINT
NEXT pp
DATA A,B,C,D,X,Y,Z,W
DATA 2,3,3,9,10,11 ! A
DATA 0,1,7,8,8,8 ! B
DATA 5,5,6,6,6,6 ! C
DATA 4,4,4,4,12,12 ! D
DATA 5,5,6,6,7,7 ! X
DATA 1,2,3,9,10,11 ! Y
DATA 0,1,7,8,8,9 ! Z
DATA 3,4,4,5,11,12 ! W
END
REM 十進BASIC添付"\BASICw32\SAMPLE\COMBINAT.BAS"より
REM 1~nの集合からr個を選ぶ組合せを生成する。配列com(,)
EXTERNAL SUB combination(a(),n,k,r,com(,),count)
! k以降の数からr個を選択する
IF r=0 THEN
LET count=count+1
LET ri=1
FOR i=1 TO n
IF a(i)=1 THEN
LET com(count,ri)=i
LET ri=ri+1
END IF
NEXT i
ELSE
FOR i=k TO n-r+1
LET a(i)=1
CALL combination(a,n,i+1,r-1,com,count)
LET a(i)=0
NEXT i
END IF
END SUB
|
|