|
> No.176[元記事へ]
GAIさんへのお返事です。
10万回の試行で、4枚とも表になる組数はすべて同じ確率で出現すると出ました。
組 確率 平均枚数
0 .07669 25.06枚
1 .07519 31.20枚
2 .07792 35.14枚
3 .07686 38.10枚
4 .07674 40.48枚
5 .07722 42.48枚
6 .07848 44.25枚
7 .07573 45.84枚
8 .07778 47.28枚
9 .07741 48.59枚
10 .07723 49.81枚
11 .07564 50.94枚
12 .07711 52.00枚
42.41枚
DECLARE EXTERNAL SUB sort
PUBLIC NUMERIC c
LET tt=TIME
LET s=4
LET n=13
LET c=s*n
DIM check(c),card(c),position(n,s),face(n),total(0 TO n-1),count(0 TO n-1)
LET test=100000 ! 100000で125秒
FOR t=1 TO test
CALL prep
CALL play
NEXT t
LET cc=0
PRINT " 組 確率 平均枚数"
FOR i=0 TO n-1
PRINT USING " ## .##### ##.##枚" : i,total(i)/test,count(i)/total(i)
LET cc=cc+count(i)
NEXT i
PRINT USING " ##.##枚" : cc/test
PRINT INT(TIME-tt);"sec"
SUB prep
FOR i=1 TO c
LET check(i)=RND
NEXT i
CALL sort(check,card)
!MAT PRINT card;
FOR j=1 TO s
FOR i=1 TO n
LET position(i,j)=card((j-1)*n+i)
NEXT i
NEXT j
!MAT PRINT position;
END SUB
SUB play
MAT face=ZER
LET cc=0
CALL open_card(n)
!MAT PRINT face;
LET f=0
FOR i=1 TO n-1
IF face(i)=s THEN LET f=f+1
NEXT i
LET total(f)=total(f)+1
LET count(f)=count(f)+cc
END SUB
SUB open_card(nn)
LET cc=cc+1
LET look=position(nn,1)
FOR j=1 TO s-1
LET position(nn,j)=position(nn,j+1)
NEXT j
LET p=MOD(look,n)+1
!PRINT p;
LET face(p)=face(p)+1
IF face(n)=s THEN EXIT SUB
CALL open_card(p)
END SUB
END
REM 十進BASIC添付"\BASICw32\Library\SORT2.LIB"より
! ixにはmと下限,上限を一致させた空の配列を指定する。
! mは参照されるのみ。
! ixにmの添字を大きさの順に並べて返す。
! つまり,m(ix(1))≦m(ix(2))≦m(ix(3))≦・・・となる。
EXTERNAL SUB sort(m(),ix())
FOR i=1 TO c
LET ix(i)=i
NEXT i
CALL q_sort(m,ix,1,c)
END SUB
EXTERNAL SUB q_sort(m(),a(),l,r)
IF r<=l THEN
EXIT SUB
ELSE
LET i=l-1
LET j=r
LET pv=m(a(r))
DO
DO
LET i=i+1
LOOP UNTIL pv<=m(a(i))
DO
LET j=j-1
LOOP UNTIL j<=i OR m(a(j))<=pv
IF j<=i THEN EXIT DO
LET t=a(i)
LET a(i)=a(j)
LET a(j)=t
LOOP
LET t=a(i)
LET a(i)=a(r)
LET a(r)=t
CALL q_sort(m,a,l,i-1)
CALL q_sort(m,a,i+1,r)
END IF
END SUB
|
|