仮説検定の話のついでに提供した珈琲豆の話。 ドンガバチョの「製品ホゲーX」のシムは挫折?したので、せめてこちらの方を。 では問題
問題は毎回同じブレンドの珈琲を飲んでいると言えるか?です。あるいは,毎回同じブレンドの珈琲を飲もうと思えば、どの程度の数の豆を一度に挽けば良いのか?です。
そこで「十進ベーシック」ソースはこんなのです。
!ブラジル50%、メキシコ25%、キリマンジャロ25% LET n=10000 !豆10000個 LET a=50 !豆1の割合(%) LET b=25 !豆2の割合(%) LET c=25 !豆3の割合(%)
この配合は,どこかの珈琲屋さんのブレンドです。 って豆ってこんなに大雑把なのでしょうか?それはさておき,
LET bean$="" !豆を測る。 LET ma=INT(n*a/100) LET bean$=REPEAT$("a",ma) LET mb=INT(n*b/100) LET bean$=bean$&REPEAT$("b",mb) LET mc=n-(ma+mb) LET bean$=bean$&REPEAT$("c",mc)
豆は文字列で。最初は配列にしようかとも思ったのですが, シャッフル(ブレンド)が面倒だと思い文字列にしました。 この時点で,Rubyの方が楽なのにと思いましたが, 今年の職場のコンピュータにはRubyをまだ入れてません。致し方なし。
!PRINT bean$ !ブレンドする。 RANDOMIZE
乱数の初期設定です。
FOR i=1 TO n LET l=INT(RND*n)+1 LET r=INT(RND*n)+1 IF l>r THEN LET dum=l LET l=r LET r=dum END IF LET bean$=bean$(l:r)&bean$(1:l-1)&bean$(r+1:n) NEXT i PRINT bean$
トランプのように文字列を繰ります。 この回数も問題だとは思いますが...
!テスト LET tn=100 ! 資料とする豆粒の個数 100 LET tt=20 ! 試行の回数
で,混ぜ終わった豆から一掴み取り出して, 調べます。 これを20回繰り返します。
FOR j=1 TO 10 LET sd=0 FOR ti=1 TO tt LET s=INT((n-tn)*RND)+1 LET tbean$=bean$(s:s+tn-1) ! PRINT tbean$ LET cnta=0 LET cntb=0 LET cntc=0 FOR i=1 TO tn SELECT CASE tbean$(i:i) CASE "a" LET cnta=cnta+1 CASE "b" LET cntb=cntb+1 CASE "c" LET cntc=cntc+1 END SELECT NEXT i LET d=SQR((cnta-INT(tn*a/100))^2+(cntb-INT(tn*b/100))^2+(cntc-INT(tn*c/100))^2) LET sd=sd+d ! PRINT cnta;cntb;cntc;d NEXT ti PRINT sd/tn NEXT j END
というセットを10回繰り返します。 取り合えず,評価は期待される豆の個数との距離の平均を取ってみました。 では,結果です。
1.25391339658267 1.3575955160437 1.29658418011372 1.33927642901613 1.48064839386292 1.08039141138613 1.39465573097473 1.40410594821044 1.58761416119748 1.45843188521922
評価の仕方もですが,ブレンドの割合,豆の種数,ブレンドする量,取り出す量, 少なくともこの4つぐらいは数値を動かして色々試して見ましょう。(って他人事か?) 個人的には前にも話題になったような気がしますが,混ぜ方を変えるとどうかってことが気になります。つまり,トランプのシャッフルのような混ぜ方が妥当かどうか?ですね。うーん。謎が謎を呼ぶ。