<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" >
  <channel>
  <title>はしりがき</title>
  <link>https://dmscribbling.blog.shinobi.jp/</link>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="https://dmscribbling.blog.shinobi.jp/RSS/" />
  <description>ガラパゴスへよおこそ。</description>
  <lastBuildDate>Fri, 26 Nov 2010 13:21:43 GMT</lastBuildDate>
  <language>ja</language>
  <copyright>© Ninja Tools Inc.</copyright>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />

    <item>
    <title>統計確率計算機のつかいかた1</title>
    <description>
    <![CDATA[<a href="http://dmscribbling.blog.shinobi.jp/Entry/105/">これ</a>の使い方<br />
<br />
UIを作る能力は私にはないので、c言語の知識を前提に、コードを直接いじってもらうことになります。<br />
<br />
例１、青銅の鎧を先攻3ターン目に使用できる確率(ドローカード不使用)<br />
<br />
【カードセット】<br />
4x 青銅の鎧<br />
15x 緑マナ<br />
<br />
先攻３ターン目までに引く総手札枚数は7枚。この中に青銅の鎧と緑マナが各1枚以上あればいいわけです。<br />
注意すべきは「緑マナ」の中に《青銅の鎧》が含まれていること。つまり《青銅の鎧》は《青銅の鎧》と「緑マナ」の両方として扱うべきカードということになります。<br />
というわけで、カードセットは次のように訂正します。<br />
<br />
【カードセット】<br />
4x 青銅の鎧かつ緑マナ<br />
11x 緑マナ<br />
<br />
さて、調整すべき値は次の通り。<br />
sizeof_hand<br />
cardset[]<br />
cardtype[]<br />
sizeof_cardset<br />
conditon<br />
exception<br />
trynum<br />
<br />
ここではexception(例外処理)、cardtype[]は使いません。それぞれ0、{0,0,0}としておいてください。<br />
上から順に見ていきましょう。<br />
sizeof_handは手札枚数。ここは7枚。<br />
cardset[]はカードの種類ごとの枚数を格納する配列。<br />
cardset[0] = 4,&nbsp; cardset[1] = 11, cardset[2] = 40としておけばOKです。ここで[0]=青銅の鎧かつ緑マナ、[1]=緑マナ、[2]=全体という割り当てをしたことに注意。<br />
sizeof_cardsetはカードの種類。ここでは2種類ですが、それ以外の25枚のカードの場所も必要なので、それを加えてsizeof_cardset = 3。<br />
conditon(条件)は「何を以って成功とするか」。この場合は《青銅の鎧》とそれに必要な緑マナを引き当てることですから、<br />
□「青銅の鎧かつ緑マナ」が1枚以上 かつ 「緑マナ」が1枚以上<br />
□「青銅の鎧かつ緑マナ」が2枚以上<br />
のいずれかになります。<br />
「青銅の鎧かつ緑マナ」「緑マナ」を何枚引いたかはgroupcount[sizeof_cardset]に保存されています。先ほど割り当てたように、[0]=青銅の鎧かつ緑マナ、[1]=緑マナです。<br />
これを使って条件をc言語化すると、上の２条件はそれぞれ<br />
□groupcount[0]&gt;0 &amp;&amp; groupcount[1]&gt;0<br />
□groupcount[0]&gt;1<br />
となり、これを組み合わせた<br />
(groupcount[0]&gt;0 &amp;&amp; groupcount[1]&gt;0) || groupcount[0]&gt;1<br />
を最上部のdefine文に叩き込めばおkです。<br />
最後にtrynum(試行回数)。少なくとも1000回程度は欲しいところ。多ければ多いほど精度が高まりますが、データ型がintなのでオーバーフローに注意。<br />
<br />
<br />
<br />
例２、無頼勇騎ウインドアックスを後攻５ターン目に使用できる確率(ドローカード不使用)<br />
<br />
ここでもexception(例外処理)、cardtype[]は使いません。それぞれ0、{0,0,0,0}としておいてください。<br />
<br />
【カードセット】<br />
4x 無頼勇騎ウインドアックス<br />
16x 緑マナ<br />
12x 赤マナ<br />
<br />
まずカードセットを書き直して<br />
<br />
【カードセット】<br />
4x 無頼勇騎ウインドアックスかつ緑マナかつ赤マナ<br />
12x 緑マナ<br />
8x 赤マナ<br />
<br />
次に<br />
sizeof_hand = 10<br />
cardset[0] = 4<br />
cardset[1] = 12<br />
cardset[2] = 8<br />
cardset[3] = 40<br />
sizeof_cardset = 4<br />
を入力。<br />
<br />
conditionはやや複雑ですが<br />
□groupcount[0]&gt;2<br />
□groupcount[0]&gt;1 &amp;&amp; groupcount[1]&gt;0<br />
□groupcount[0]&gt;1 &amp;&amp; groupcount[2]&gt;0<br />
□groupcount[0]&gt;0 &amp;&amp; groupcount[1]&gt;0 &amp;&amp; groupcount[2]&gt;0<br />
これを||で繋いで完了。<br />
<br />
trynumは適当に。条件やカードの種類が多くなると処理が遅くなるので、上手く調整してください。<br />]]>
    </description>
    <category>Articles</category>
    <link>https://dmscribbling.blog.shinobi.jp/articles/%E7%B5%B1%E8%A8%88%E7%A2%BA%E7%8E%87%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%AE%E3%81%A4%E3%81%8B%E3%81%84%E3%81%8B%E3%81%9F1</link>
    <pubDate>Sun, 09 May 2010 04:11:52 GMT</pubDate>
    <guid isPermaLink="false">dmscribbling.blog.shinobi.jp://entry/106</guid>
  </item>
    <item>
    <title>正式版コードver1.2くらい</title>
    <description>
    <![CDATA[#include&lt;stdio.h&gt;<br />
#include&lt;stdlib.h&gt;<br />
#include&lt;time.h&gt;<br />
//hit条件<br />
#define hit_condition groupcount[0]+groupcount[3]+groupcount[4]+groupcount[6]&gt;0 &amp;&amp; groupcount[1]+groupcount[3]+groupcount[5]+groupcount[6]&gt;0 &amp;&amp; groupcount[2]+groupcount[4]+groupcount[5]+groupcount[6]&gt;0<br />
#define exception 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //例外条件<br />
#define sizeof_cardset 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cardset[]の要素数<br />
#define sizeof_hand 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //手札枚数<br />
<br />
int main(void){<br />
&nbsp;&nbsp;&nbsp; int trynum = 30000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //試行回数<br />
&nbsp;&nbsp;&nbsp; int cardset[sizeof_cardset] = {4,6,12,2,1,2,0,40};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //扱うカードの、種類ごとの枚数<br />
&nbsp;&nbsp;&nbsp; int cardtype[sizeof_cardset] = {0,0,0,1,1,1,1,0};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //カードの属性。現状レインボー(1)or単色(0)のみ<br />
&nbsp;&nbsp;&nbsp; int groupcount[sizeof_cardset];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //グループカウンタ。要素数をcardset[]に追従して、手札中に種類Aのカードが1枚あれば同じ位置の要素をインクリメント<br />
&nbsp;&nbsp;&nbsp; int hand[sizeof_hand];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //手札[手札枚数]<br />
&nbsp;&nbsp;&nbsp; int i,k,j,l,m,n,p,q;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //forループ用変数<br />
&nbsp;&nbsp;&nbsp; int duplcount,siev,groupnum,try;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //重複判定用カウンタ、ふるい分け用変数、手札種類保存用変数、試行番号<br />
&nbsp;&nbsp;&nbsp; int hitcount = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //条件を満たした試行の回数を数えるカウンタ<br />
&nbsp;&nbsp;&nbsp; int shuffle = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //乱数調整用変数<br />
&nbsp;&nbsp;&nbsp; double probability;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //確率<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; //「それ以外」の枚数設定<br />
&nbsp;&nbsp;&nbsp; for(m=0; m&lt;sizeof_cardset-1; m++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cardset[sizeof_cardset-1] = cardset[sizeof_cardset-1]-cardset[m];<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; for(try=0; try&lt;trynum; try++){<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //グループカウンタのリセット<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(l=0; l&lt;sizeof_hand; l++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; groupcount[l] = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //手札生成<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //過去のカードとの被り番号をチェックするのがforループ[k]<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //被らないような番号になるまで乱数を作り直すのがdo-whileループ<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //以上の操作を手札枚数分繰り返すのがforループ[i]<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(i=0; i&lt;sizeof_hand; i++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; do{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; duplcount = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; srand(try + i + shuffle + (unsigned int)time(NULL));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hand[i] = rand()%40;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(k=0; k&lt;i; k++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(hand[k] == hand[i]) duplcount++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; shuffle++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }while(duplcount &gt; 0);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //ふるい分け<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //「カードに割り振った番号」を「カードの種類」に変換する<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //変数sievに、cardset[]の値を番号の若いほうから加算していく<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //siev&gt;hand[n]となったときのjをgroupnumに保存しておき、ループ脱出後にこの位置の要素をインクリメント+hand[n]の値をgroupnumに置き換える<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(n=0; n&lt;sizeof_hand; n++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; siev = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(j=0; j&lt;sizeof_cardset; j++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; siev = siev + cardset[j];<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; groupnum = j;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(siev &gt; hand[n]) break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hand[n] = groupnum;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(exception){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hand[n] = sizeof_cardset-1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; groupcount[groupnum]++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //条件判定<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //hithit_conditionはヘッダで定義する<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(hit_condition) hitcount++;<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //動作確認用<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf(&quot;%d and %d\n&quot;, hitcount, try);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(p=0; p&lt;sizeof_cardset-1; p++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf(&quot;%d,&quot;, groupcount[p]);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf(&quot;%d\n&quot;, groupcount[sizeof_cardset-1]);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(q=0; q&lt;sizeof_hand-1; q++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf(&quot;%d,&quot;, hand[q]);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf(&quot;%d\n&quot;, hand[sizeof_hand-1]);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; //確率計算<br />
&nbsp;&nbsp;&nbsp; probability = 100.0*hitcount/trynum;<br />
&nbsp;&nbsp;&nbsp; printf(&quot;P = %f\n&quot;, probability);<br />
&nbsp;&nbsp;&nbsp; return 0;<br />
}<br />
<br />
<br />
解説書いた。汎用性もうpした。<br />
必要に応じて&quot;conditon&quot;,&quot;exception&quot;,&quot;sizeof_hand&quot;,''cardset[]&quot;,&quot;cardtype[]&quot;,&quot;sizeof_cardset&quot;,&quot;trynum&quot;を調整してください。<br />
for(int i = 0; i&lt;N; i++)とかはやってないのでC90でもいけます。<br />
計算速度は飛躍的にうp。一瞬で計算できます。<br />
ただ乱数に偏りがあるっぽいのでそこが課題。具体的に言うと、秒が変わらない限り計算結果も同じになる。<br />
頻繁に書き換えます。<br />
<br />]]>
    </description>
    <category>Articles</category>
    <link>https://dmscribbling.blog.shinobi.jp/articles/%E6%AD%A3%E5%BC%8F%E7%89%88%E3%82%B3%E3%83%BC%E3%83%89ver1.2%E3%81%8F%E3%82%89%E3%81%84</link>
    <pubDate>Sun, 09 May 2010 01:21:34 GMT</pubDate>
    <guid isPermaLink="false">dmscribbling.blog.shinobi.jp://entry/105</guid>
  </item>
    <item>
    <title>試作コード</title>
    <description>
    <![CDATA[#include&lt;stdio.h&gt;<br />
#include&lt;stdlib.h&gt;<br />
#include&lt;time.h&gt;<br />
#define N 8<br />
<br />
int main(void){<br />
&nbsp;&nbsp;&nbsp; int cardset[8] = {1,6,12,2,1,4,0,40};<br />
&nbsp;&nbsp;&nbsp; int categorycount[8] = {0,0,0,0,0,0,0,0};<br />
&nbsp;&nbsp;&nbsp; int hand[N];<br />
&nbsp;&nbsp;&nbsp; int i,k,j,l,m;<br />
&nbsp;&nbsp;&nbsp; int duplcount,siev,handnum,categorynum,try,trynum = 1000;<br />
&nbsp;&nbsp;&nbsp; int hitcount = 0;<br />
&nbsp;&nbsp;&nbsp; double probability;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; //「それ以外」の枚数設定；cardset[7]==40<br />
&nbsp;&nbsp;&nbsp; for(m=0; m&lt;8; m++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cardset[7] = cardset[7]-cardset[m];<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; for(try=0; try&lt;trynum; try++){<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //カテゴリカウンタのリセット<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(l=0; l&lt;N; l++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; categorycount[l] = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //手札生成<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(i=0; i&lt;N; i++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; do{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; duplcount = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; srand(try + i + (unsigned int)time(NULL));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hand[i] = rand()%40;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(k=0; k&lt;i; k++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(hand[k] == hand[i]) duplcount++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }while(duplcount &gt; 0);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //ふるい分け<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(handnum=0; handnum&lt;N; handnum++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; siev = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(j=0; j&lt;8; j++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; siev = siev + cardset[j];<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; categorynum = j;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(siev &gt; hand[handnum]) break;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; categorycount[categorynum]++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //条件判定<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(categorycount[0]+categorycount[3]+categorycount[4]+categorycount[6]&gt;0 &amp;&amp; categorycount[1]+categorycount[3]+categorycount[5]+categorycount[6]&gt;0 &amp;&amp; categorycount[2]+categorycount[4]+categorycount[5]+categorycount[6]&gt;0) hitcount++;<br />
&nbsp;&nbsp;&nbsp; //動作確認用<br />
&nbsp;&nbsp;&nbsp; printf(&quot;%d and %d\n&quot;, hitcount, try);<br />
&nbsp;&nbsp;&nbsp; printf(&quot;%d,%d,%d,%d,%d,%d,%d\n&quot;,categorycount[0],categorycount[1],categorycount[2],categorycount[3],categorycount[4],categorycount[5],categorycount[6],categorycount[7]);<br />
&nbsp;&nbsp;&nbsp; printf(&quot;%d,%d,%d,%d,%d,%d,%d\n&quot;,hand[0],hand[1],hand[2],hand[3],hand[4],hand[5],hand[6],hand[7]);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; //確率計算<br />
&nbsp;&nbsp;&nbsp; probability = 100.0*hitcount/trynum;<br />
&nbsp;&nbsp;&nbsp; printf(&quot;P = %f\n&quot;, probability);<br />
&nbsp;&nbsp;&nbsp; return 0;<br />
}<br />
<br />
trynum=1000で計算したら8分もかかった(Athlon ll X4 630)<br />
パターンAが成立する確率はいくらか、というのを求めるのには十分な速さ。<br />
でも「100回回したときの「パターンAの成立確率」は真の確率とどのくらいズレがあるか」を統計学的に云々、ってのをやるには時間がかかりすぎるか。10回回したときの（ryを1000回やるとしても10000回＝80分かかる計算だしな。<br />
<br />
重複を避けて乱数生成する部分はまだ改善の余地ありそう<br />
解説書くの面倒だったけど、個別の質問なら受けます<br />
<br />
追記<br />
<br />
1--61.4%<br />
2--57.6%<br />
3--59.1%<br />
4--59.0%<br />]]>
    </description>
    <category>Articles</category>
    <link>https://dmscribbling.blog.shinobi.jp/articles/%E8%A9%A6%E4%BD%9C%E3%82%B3%E3%83%BC%E3%83%89</link>
    <pubDate>Sat, 08 May 2010 06:25:29 GMT</pubDate>
    <guid isPermaLink="false">dmscribbling.blog.shinobi.jp://entry/104</guid>
  </item>
    <item>
    <title>流れ</title>
    <description>
    <![CDATA[<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8">
<title></title>
<meta name="GENERATOR" content="OpenOffice.org 3.1  (Linux)"> 	<style type="text/css">
	<!--
		@page { margin: 2cm }
		P { margin-bottom: 0.21cm }
	-->
	</style>
<p style="margin-bottom: 0cm;">「シナジー」という言葉はあまり良くないと最近思うようになった。なぜか。理由は２つ。<br />
&nbsp;</p>
<p style="margin-bottom: 0cm; text-align: left;">１、「時間」の概念が欠けている</p>
<p style="margin-bottom: 0cm; text-align: left;"><font face="さざなみ明朝, serif">&quot;synergy&quot;</font>は日本語で「相乗効果」。要素とその関係が問題になるが、それだけ。動的要素や時間的順序が見落とされている。簡略化のために静的要素に絞るなら「シナジー」でいいんだけど、ことカードゲームに限って言えば、それはダメだ、というのが「シナジー」についての記事を書いてきた私の見解。<br />
&nbsp;</p>
<p style="margin-bottom: 0cm; text-align: left;">２、「外力の影響」を意識していない</p>
<p style="margin-bottom: 0cm; text-align: left;">外力とは「外から加わる力」。要するに相手プレイヤーの干渉。カード<font face="さざなみ明朝, serif">A</font>、カード<font face="さざなみ明朝, serif">B</font>があります。相性良いです。これだけだ。相手プレイヤー、という登場人物が欠落している。<font face="さざなみ明朝, serif">(*1)<br />
</font></p>
<p style="margin-bottom: 0cm; text-align: left;"><font face="さざなみ明朝, serif">(*1)</font></p>
<p style="margin-bottom: 0cm; text-align: left;">メタを張る意識が欠けているという意味ではない。相手の妨害を前提にしていない、という意味。</p>
<p style="margin-bottom: 0cm;"><font face="さざなみ明朝, serif"><br />
</font></p>
<p style="margin-bottom: 0cm;">ではどんな言葉が妥当か。私は「流れ」を推したい。</p>
<p style="margin-bottom: 0cm;">時間概念は当然出てくるし、流れをせき止めるものとしての相手プレイヤーの存在も、その動的なイメージから想起されると思うんだけど、どうだろう。</p>
<p style="margin-bottom: 0cm;">とまれ、ここから「シナジー」は「流れ」という言葉に置き換えることとしよう。</p>
<p style="margin-bottom: 0cm;">&nbsp;</p>
<p style="margin-bottom: 0cm;">さて、「流れ」とは何か再考しよう。まず相乗効果。<font face="さざなみ明朝, serif">2</font>枚以上のカードを使い、単体使用時よりも大きな成果を収めること。流れには上流と下流があり、ここでは上流&rarr;下流のように流れを表現することにする。上流&rarr;下流の順序を入れ替えて上流(元下流)&rarr;下流(元上流)のようにできるものもある。</p>
<p style="margin-bottom: 0cm;">「流れ」はせき止めることもできる。簡単にせき止められる水路もあればそうでないのもある。また、同じ種類の水路でも、上流から下流までの水路の長さ、すなわち時間的間隔が長いほど、せき止めやすくなる。</p>
<p style="margin-bottom: 0cm;">ここまでが「流れ」という言葉に持たせたかったニュアンスだ。俯瞰的な書き方をしてきたが、今度はより詳しく見ていこう。時間的順序はいったん飛ばして、水路の種類からはじめることにする。</p>
<p style="margin-bottom: 0cm;"><br />
■水路の種類</p>
<p style="margin-bottom: 0cm;">「流れ」において「下流」が「上流」を参照しなければならない。ここで「どこを」参照するかによって理論上６通りのパターンを考えることができる。<br />
&nbsp;</p>
<p style="margin-bottom: 0cm;">１、バトルゾーン</p>
<p style="margin-bottom: 0cm;">クリーチャーの進化、ミストリエスの使用、などなど<font face="さざなみ明朝, serif">(*2)</font>。使用後バトルゾーンに残らない呪文や城を除けば、ほぼすべてのクリーチャーやクロスギアがここで「流れ」の「上流」になる可能性がある。ほかの例としては「邪魂創世」。これはバトルゾーンに小型クリーチャーや<font face="さざなみ明朝, serif">cip</font>、<font face="さざなみ明朝, serif">pig</font>が残るカードを「上流」に必要とする。</p>
<p style="margin-bottom: 0cm;"><font face="さざなみ明朝, serif">(*2)</font></p>
<p style="margin-bottom: 0cm;">後述するが、ハッスルキャッスルは「シールド」の区分である。</p>
<p style="margin-bottom: 0cm;">&nbsp;</p>
<p style="margin-bottom: 0cm;">２、手札</p>
<p style="margin-bottom: 0cm;">「手札を何枚捨てる」のような、手札を参照するタイプの「下流」において、捨てられたカードは「上流」として扱われることがある。具体的には、捨てられることで何らかのメリットがある（バイケン）とか、必要のないカードを捨てることでデメリットを殺すとか。</p>
<p style="margin-bottom: 0cm;">バトルゾーンと違ってカードを使用する必要がないが、「下流」を使うまで手札に待機していなければならず、その間の選択肢量が下がってしまう問題がある。</p>
<p>&nbsp;</p>
<p style="margin-bottom: 0cm;">３、マナ</p>
<p style="margin-bottom: 0cm;">チャージャー&rarr;マナ回収や、手札からマナチャージ&rarr;母なる星域など。物によるが、上流では必ずしもカードを使用する必要がない。手札からノーデメリットでマナチャージできるのが重要。除去される可能性は低めだが、ランデスの存在はマイナーではないし、龍神メタルのように高い性能のついでにランデス成分が入っているカードも若干あるのが気がかり。<br />
&nbsp;</p>
<p style="margin-bottom: 0cm;">４、墓地</p>
<p style="margin-bottom: 0cm;">ダンディナスオ&rarr;インフェルノサインなど。手札やマナほど上流が簡単ではなく、カードを墓地に送るには「相手に除去してもらう」か「自分から墓地に送るようなカードを使う」しかない。しかしいったん墓地に送ってしまえばそこから流れが止められることはまずない。<br />
&nbsp;</p>
<p style="margin-bottom: 0cm;">５、山札</p>
<p style="margin-bottom: 0cm;">テンペストベビー&rarr;転生プログラムや、バルガゲイザーを使った流れがここ。やはり「コーライルなどで相手に戻してもらう」か「自分から山札に戻すようなカードを使う」しかない。いったん山札に戻せば相手の直接的妨害はないものの、毎ターン必ずカードを<font face="さざなみ明朝, serif">1</font>枚引かなければならないので、他の領域のように「相手の妨害がなければ下流を引き当てるまで待機していればよい」というわけにはいかない、というのが山札に特有な事情である。<br />
&nbsp;</p>
<p style="margin-bottom: 0cm;">６、シールド</p>
<p style="margin-bottom: 0cm;">スーパーエメラル&rarr;ベンゾなど。山札の場合と同様に「自分からシールドに送るようなカード」を使うしかないが、かなり種類は限られる。直接的に妨害するようなカードはこれまた少ないが、クリーチャーの攻撃によって妨害できることを考えれば、せき止めの危険はかなり大きい。現状では、<font face="さざなみ明朝, serif">1</font>ターン中に連続して上流&rarr;下流と使ってしまうのが主流か。</p>
<p style="margin-bottom: 0cm;">&nbsp;</p>
<p style="margin-bottom: 0cm;">簡約版がこっち。</p>
<table cellspacing="1" cellpadding="1" border="1" style="width: 700px; height: 157px;">
    <tbody>
        <tr>
            <td>水路の種類</td>
            <td>上流の準備の容易さ</td>
            <td>安全性</td>
            <td>備考</td>
        </tr>
        <tr>
            <td>バトルゾーン</td>
            <td><font color="#00ff00">中</font></td>
            <td><font color="#0000ff">低</font></td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>手札</td>
            <td><font color="#ff0000">高</font></td>
            <td><font color="#0000ff">低</font></td>
            <td>上流カードの待機による手札選択肢量減</td>
        </tr>
        <tr>
            <td>マナ</td>
            <td><font color="#ff0000">高</font></td>
            <td><font color="#00ff00">中</font></td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>墓地</td>
            <td><font color="#0000ff">低</font></td>
            <td><font color="#ff0000">高</font></td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>山札</td>
            <td><font color="#0000ff">低</font></td>
            <td><font color="#ff0000">高</font></td>
            <td>上流の待機時間に制約がある</td>
        </tr>
        <tr>
            <td>シールド</td>
            <td><font color="#0000ff">低</font></td>
            <td><font color="#00ff00">中</font></td>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>
<p style="margin-bottom: 0cm;"><br />
基準は次の通り。<br />
□上流の準備の容易さ<br />
カードを引くだけで良い手札、マナが高。さらにコストがかかるバトルゾーンが中。さらにそれを移動させるための別カードが必要な墓地、山札、シールドは低。例外もあるけどだいたいあってると思う。<br />
□安全性(相手の妨害に対しての安全性)<br />
ほとんどアンタッチャブルな墓地、山札は高。クリーチャーに攻撃される危険とシールドブレイクによる手札増加メリットがジレンマとなるシールド、環境によるとしか言いようないマナは中。あらゆるデッキが干渉カードを積みたがるバトルゾーン、手札は低。<br />
<br />
■時間的順序<br />
&nbsp;</p>
<p style="margin-bottom: 0cm;">これら６種類の水路を使った流れの、上流と下流を入れ替えても成立するのはどのようなものだろうか？</p>
<p style="margin-bottom: 0cm;">下流によって生じる効果(上流による相乗効果込)のうち、相手のカードへの干渉を除けば、自分のバトルゾーンへの還元が最も大きいと考えられる(コンボを用いてまでバトルゾーン以外の自分の領域に効果を還元する例(スナフマッシュルーム&rarr;邪魂創世とか)は比較的稀)。つまり下流にはバトルゾーンへ効果を向けたカードが多い。よって下流にはバトルゾーンを水路とするカードが多い。上流下流を入れ替えたときに流れが成立するなら、その水路はバトルゾーンである可能制が高い。だから最有力はバトルゾーンと言える。これ以外は、今のところ少ないか役に立たない。</p>
<p style="margin-bottom: 0cm;"><a href="http://dmscribbling.blog.shinobi.jp/Entry/96/">この記事</a>で言うところの「一方通行シナジー」「相互依存シナジー」がまさに時間的順序にあたる<font face="さざなみ明朝, serif">(</font>前者は上流と下流を入れ替えると成立しないシナジー、後者は上流と下流を入れ替えても成立するシナジー<font face="さざなみ明朝, serif">)</font>のだが、先ほどの話から、「相互依存シナジー」は<font face="さざなみ明朝, serif">A&rarr;B</font>も<font face="さざなみ明朝, serif">B&rarr;A</font>もバトルゾーンを水路とすることがわかる。</p>
<p style="margin-bottom: 0cm;">&nbsp;</p>
<p style="margin-bottom: 0cm;">時間的順序について言うべきことはこのくらい。最後に水路の長さの話を。<br />
<br />
■水路の長さ<br />
&nbsp;</p>
<p style="margin-bottom: 0cm;">「水路の長さ」は別に難しい話ではない。バトルゾーンを水路とする流れの場合、上流の使用&rarr;下流の使用までを<font face="さざなみ明朝, serif">1</font>ターン間隔(水路が短い)で行うか、<font face="さざなみ明朝, serif">2</font>ターン間隔(水路が長い)で行うかでは、後者のほうが妨害される確率が高くなるというだけのことだ。ただしこれにも「水路の種類」が密接に関係していて、例えば墓地を水路とする場合、相手がコンクリオン(！)を積んでいないでない限り、いくら時間を空けても妨害される確率は全く変わらない。山札にも同じことが言える。シールド、マナはきわどい。</p>
<p style="margin-bottom: 0cm;">つまり、「水路の長さ」が流れの成功率に関わってくるのは、「水路の種類」がバトルゾーン、手札のときだけだという結論になる。</p>
<p style="margin-bottom: 0cm;">&nbsp;</p>
<p style="margin-bottom: 0cm;">時間的順序、水路の長さの件も含めて「水路の種類」とその特徴をまとめておこう。<br />
&nbsp;</p>
<table cellspacing="1" cellpadding="1" border="1" width="700">
    <tbody>
        <tr>
            <td>水路の種類</td>
            <td>上流の準備の容易さ</td>
            <td>安全性</td>
            <td>水路が長くなると安全性が</td>
            <td>備考</td>
        </tr>
        <tr>
            <td>バトルゾーン</td>
            <td><font color="#00ff00">中</font></td>
            <td><font color="#0000ff">低</font></td>
            <td><font color="#0000ff">下がる</font></td>
            <td>双方向の流れがあるものが比較的多い</td>
        </tr>
        <tr>
            <td>手札</td>
            <td><font color="#ff0000">高</font></td>
            <td><font color="#0000ff">低</font></td>
            <td><font color="#0000ff">下がる</font></td>
            <td>上流カードの待機による手札選択肢量減</td>
        </tr>
        <tr>
            <td>マナ</td>
            <td><font color="#ff0000">高</font></td>
            <td><font color="#00ff00">中</font></td>
            <td><font color="#00ff00">やや下がる</font></td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>墓地</td>
            <td><font color="#0000ff">低</font></td>
            <td><font color="#ff0000">高</font></td>
            <td><font color="#ff0000">変わらない</font></td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>山札</td>
            <td><font color="#0000ff">低</font></td>
            <td><font color="#ff0000">高</font></td>
            <td><font color="#ff0000">変わらない</font></td>
            <td>上流の待機時間に制約がある</td>
        </tr>
        <tr>
            <td>シールド</td>
            <td><font color="#0000ff">低</font></td>
            <td><font color="#00ff00">中</font></td>
            <td><font color="#00ff00">やや下がる</font></td>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>
<p style="margin-bottom: 0cm;"><br />
途中で参照したこ<a href="http://dmscribbling.blog.shinobi.jp/Entry/96/">この記事</a>も、バトルゾーン水路という前提でマナブースト型とコントロール型を比較したものだと考えれば、すっきりして見えそうだ。バトルゾーン水路でなくても、同じ「水路の種類」という前提であればバトルゾーン水路の場合とほとんど同じことが言えるが、「相互依存シナジー」が抜けて「一方通行シナジー」と「シナジーなし」の２パターンの話になる点が異なる。</p>
<br />
</meta>
</meta>]]>
    </description>
    <category>Articles</category>
    <link>https://dmscribbling.blog.shinobi.jp/articles/%E6%B5%81%E3%82%8C</link>
    <pubDate>Fri, 07 May 2010 13:15:47 GMT</pubDate>
    <guid isPermaLink="false">dmscribbling.blog.shinobi.jp://entry/103</guid>
  </item>
    <item>
    <title>お</title>
    <description>
    <![CDATA[<dl class="thread">
    <dd><br />
    <br />
    </dd>
    <dt>107 ：<font color="green"><b>以下、名無しにかわりましてVIPがお送りします</b></font>：2010/04/24(土) 01:00:48.03 ID:ZFzIuQgW0</dt>
    <dd> 大学の <br />
    生物は化学で化学は物理で物理は数学で数学は哲学 <br />
    </dd>
</dl>]]>
    </description>
    <category>Articles</category>
    <link>https://dmscribbling.blog.shinobi.jp/articles/%E3%81%8A</link>
    <pubDate>Fri, 23 Apr 2010 18:22:58 GMT</pubDate>
    <guid isPermaLink="false">dmscribbling.blog.shinobi.jp://entry/102</guid>
  </item>
    <item>
    <title>カードゲームの確率論(2)</title>
    <description>
    <![CDATA[A,Bに重複部分がない場合の確率は前回で求めた。ここから先──当確率論の本題──は重複部分が&quot;ある&quot;場合を取り扱う。<br />
まずは次の表から。<br />
<br />
<table cellspacing="1" cellpadding="1" border="1" width="700">
    <tbody>
        <tr>
            <td>A＼B</td>
            <td>BかつAでないカードを1枚以上引き当てる</td>
            <td>AかつBであるカードを1枚以上引き当てる</td>
        </tr>
        <tr>
            <td>AかつBでないカードを1枚以上引き当てる</td>
            <td>&nbsp; C</td>
            <td>&nbsp; D</td>
        </tr>
        <tr>
            <td>AかつBであるカードを1枚以上引き当てる</td>
            <td>&nbsp; E</td>
            <td>&nbsp; F</td>
        </tr>
    </tbody>
</table>
<br />
「Aを1枚以上引き当てる」ことは「AかつBでないカード」または「AかつBであるカード」を引き当てることと同じ。Bについても同様だから、表のように2&times;2=4通りのパターンが存在する。表中のC〜Fはそれぞれ4通りのパターンに対応している。ただしこれらには重複ケースがあって、例えば「AかつBでないカード」を1枚、「AかつBであるカード」を2枚引き当てたら、表の記号で言うとC,D,Fの3つに該当することになってしまう。こういうパターンがあると「Cの確率〜Fの確率をすべて足せばよい」という話にならない。今の例のように重複部分をダブって数えてしまうことになるから。そこで「重複部分を排除する」という操作が必要になってくる。<br />
そのために論理記号を導入しよう。<br />
<br />
A,Bといったとき、A,Bの重複部分もそれに含まれている、というのが今までの語法だったが、ここからは次のように書き換える：<br />
<br />
<table cellspacing="1" cellpadding="1" border="1" width="700">
    <tbody>
        <tr>
            <td>a</td>
            <td>AかつBでないカードを1枚以上引き当てる事象</td>
        </tr>
        <tr>
            <td>b</td>
            <td>BかつAでないカードを1枚以上引き当てる事象</td>
        </tr>
        <tr>
            <td>ab</td>
            <td>AかつBであるカードを1枚以上引き当てる事象</td>
        </tr>
    </tbody>
</table>
<br />
aと書いたとき、Bとの重複部分を暗黙のうちに除外していることに注意。これはbにも同様で、Aとの重複部分を暗黙のうちに除外している。<br />
これらの記号を用いれば論理式を使うことが出来る。<br />
or（または）に+（プラス）を、and（かつ）に.（ドット）を対応させることにすると、例えばaを一枚以上、bを一枚以上といった事象は<br />
&nbsp;&nbsp; a.b<br />
と表記できる。事象の否定(not)はシングルクォーテーション(')を用いて表すことにする。これをプライムと言って、aの否定はaプライムなどと読む。<br />
さて、このような記号を使えば、表中のCは次のように書き換えられる。<br />
<br />
<table cellspacing="1" cellpadding="1" border="1" width="700">
    <tbody>
        <tr>
            <td>A＼B</td>
            <td>b</td>
            <td>ab</td>
        </tr>
        <tr>
            <td>a</td>
            <td><font color="#800000">a.b</font></td>
            <td>D</td>
        </tr>
        <tr>
            <td>ab</td>
            <td>E</td>
            <td>F</td>
        </tr>
    </tbody>
</table>
<br />
同様にDも論理記号化するのだが、C=a.bとの重複部分を排除しなければならない。これは<br />
&nbsp;&nbsp; (a.b)'.(a.ab)<br />
とすればよい。ド・モルガン則で展開して<br />
&nbsp;&nbsp; (a'+b').(a.ab)<br />
&nbsp;=a'.(a.ab) + b'.(a.ab)<br />
a'a=o（空集合）だから第二項のみが残って<br />
&nbsp;= b'.a.ab<br />
となる。これがDにあたる。先の表を書き直そう。<br />
<br />
<table cellspacing="1" cellpadding="1" border="1" width="700">
    <tbody>
        <tr>
            <td>A＼B</td>
            <td>b</td>
            <td>ab</td>
        </tr>
        <tr>
            <td>a</td>
            <td>a.b</td>
            <td><font color="#800000">b'.a.ab</font></td>
        </tr>
        <tr>
            <td>ab</td>
            <td>E</td>
            <td>F</td>
        </tr>
    </tbody>
</table>
<br />
同様にE,Fを書き換える。それぞれ<br />
E =&nbsp;(a.b)'.(b'.a.ab)'.b.ab<br />
F =&nbsp;(a.b)'.(b'.a.ab)'.(E)'.(ab<sup>2</sup>)<br />
とすればよい。ここでab<sup>2</sup>は「AかつBであるカードを<strong>2</strong>枚以上引き当てる事象」を意味する（ことにする）。これを解くと<br />
E =&nbsp;a'.b.ab<br />
F =&nbsp;a'.b'.ab<sup>2</sup><br />
となり、表に戻して<br />
<br />
<table cellspacing="1" cellpadding="1" border="1" width="700">
    <tbody>
        <tr>
            <td>A＼B</td>
            <td>b</td>
            <td>ab</td>
        </tr>
        <tr>
            <td>a</td>
            <td>a.b</td>
            <td>b'.a.ab</td>
        </tr>
        <tr>
            <td>ab</td>
            <td>a'.b.ab</td>
            <td>a'.b'.ab<sup>2</sup></td>
        </tr>
    </tbody>
</table>
<br />
となる。以上の操作によって重複部分が排除されたので、後は<br />
P(a.b)<br />
P(b'.a.ab)<br />
P(a'.b.ab)<br />
P(a'.b'.ab<sup>2</sup>)<br />
を単純に足せばA,Bに重複部分がある場合の確率が求まる。これが二項の場合。三項の場合は次回。<br />
<br />]]>
    </description>
    <category>Articles</category>
    <link>https://dmscribbling.blog.shinobi.jp/articles/%E3%82%AB%E3%83%BC%E3%83%89%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AE%E7%A2%BA%E7%8E%87%E8%AB%96-2-</link>
    <pubDate>Mon, 19 Apr 2010 11:04:02 GMT</pubDate>
    <guid isPermaLink="false">dmscribbling.blog.shinobi.jp://entry/90</guid>
  </item>
    <item>
    <title>カードゲームの確率論(1)</title>
    <description>
    <![CDATA[■同種のカードを区別したとき、デッキ内の40枚のカードの順序のパターン(40!通り)の各々の生起確率は同様に確からしいとする<br />
<br />
重複部分を持たないカードA、カードBの枚数をそれぞれa,bとする。このとき山札上からランダムにn枚引いた時、a,bをそれぞれi,j枚引き当てる確率P(A,B)は次のようになる。
<div>&nbsp;</div>
<table cellspacing="1" cellpadding="1" border="1" style="width: 700px; height: 115px;">
    <tbody>
        <tr>
            <td><a href="//dmscribbling.blog.shinobi.jp/File/cstd.png" target="_blank"><img border="0" align="left" width="161" height="33" src="//dmscribbling.blog.shinobi.jp/Img/1271674076/" alt="cstd.png" /></a>(要拡大)</td>
        </tr>
        <tr>
            <td>&nbsp;40Cnが組み合わせの総数。AについてaCi通り、BについてbCj通りのパターンがあり、残るn-(i+j)枚のスペースに入るカードが40-(a+b)枚の中から選ばれる。</td>
        </tr>
    </tbody>
</table>
<div>&nbsp;</div>
これに対してi=1からi=aまで、j=1からj=bまでの総和をとれば、A,Bをそれぞれ1枚以上引き当てる確率が求まる。ちなみに、i=1をi=2のように書き換えれば2枚以上引き当てる確率も求まる。<br />
<br />
<table cellspacing="1" cellpadding="1" border="1" width="700">
    <tbody>
        <tr>
            <td><a href="//dmscribbling.blog.shinobi.jp/File/sumab.png" target="_blank"><img border="0" align="left" src="//dmscribbling.blog.shinobi.jp/Img/1271674088/" alt="sumab.png" /></a></td>
        </tr>
        <tr>
            <td>&nbsp;こんなかんじ</td>
        </tr>
    </tbody>
</table>
<div>&nbsp;</div>
ただしi+j&gt;nとなる場合はP(A,B)=0とする。<br />
ここまでカードが二種類の場合の話だったが、より一般化してカードA1、カードA2...カードAnの枚数をそれぞれa1,a2,...,anとすると次のようになる。<br />
<br />
<table cellspacing="1" cellpadding="1" border="1" style="width: 700px; height: 143px;">
    <tbody>
        <tr>
            <td><a href="//dmscribbling.blog.shinobi.jp/File/suma2n.png" target="_blank"><img border="0" align="left" src="//dmscribbling.blog.shinobi.jp/Img/1271674053/" alt="suma2n.png" /></a>
            <div>
            <div>&nbsp;</div>
            <br />
            <br />
            ただし<br />
            <a href="//dmscribbling.blog.shinobi.jp/File/pa2n.png" target="_blank"><img border="0" align="left" src="//dmscribbling.blog.shinobi.jp/Img/1271674041/" alt="pa2n.png" /></a><br />
            <a href="//dmscribbling.blog.shinobi.jp/File/app.png" target="_blank"><img border="0" align="left" src="//dmscribbling.blog.shinobi.jp/Img/1271674064/" alt="app.png" /></a></div>
            </td>
        </tr>
        <tr>
            <td>&nbsp;最初の式の拡張。</td>
        </tr>
    </tbody>
</table>
<br />
ここで新たな条件を付け加えてみよう。A1...Anに加え、「カードBを1枚も引かない」ことにすると<br />
<br />
<table cellspacing="1" cellpadding="1" border="1" width="700">
    <tbody>
        <tr>
            <td><a href="//dmscribbling.blog.shinobi.jp/File/bbar.png" target="_blank"><img border="0" align="left" src="//dmscribbling.blog.shinobi.jp/Img/1271674029/" alt="bbar.png" /></a></td>
        </tr>
        <tr>
            <td>&nbsp;前式から、分子の最後のCの左右に-bが加わっている。これがカードBを1枚も引かない条件となる。<br />
            追記<br />
            一番右のnCrのrのところにあるbはいらない</td>
        </tr>
    </tbody>
</table>
<br />
となる。同様に総和をとればおk。ここまでの内容を次章から使い倒すので、今の確率をP()と書くことにしてこの章を終わる。<br />]]>
    </description>
    <category>Articles</category>
    <link>https://dmscribbling.blog.shinobi.jp/articles/%E3%82%AB%E3%83%BC%E3%83%89%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%AE%E7%A2%BA%E7%8E%87%E8%AB%96-1-</link>
    <pubDate>Mon, 19 Apr 2010 10:57:19 GMT</pubDate>
    <guid isPermaLink="false">dmscribbling.blog.shinobi.jp://entry/91</guid>
  </item>
    <item>
    <title>ラルバガチャック</title>
    <description>
    <![CDATA[なぜか載せてなかった<br />
<br />
4x 日輪の守護者ソル・ガーラ<br />
2x 曙の守護者パラ・オーレシス<br />
4x 光牙忍ハヤブサマル<br />
3x 守護聖天ラルバ・ギア<br />
3x ミラクル・サーチャー<br />
1x サイバー・ブレイン<br />
1x アクアン<br />
4x エリアス<br />
2x 停滞の影タイム・トリッパー<br />
4x 機怪人形ガチャック<br />
1x スネークアタック<br />
2x バブル・トラップ<br />
3x 解体人形ジェニー<br />
1x 凶刻の刃狼ガル・ヴォルフ<br />
3x 奇面王機ボーンキラー<br />
2x 邪脚護聖ブレイガー<br />]]>
    </description>
    <category>Articles</category>
    <link>https://dmscribbling.blog.shinobi.jp/articles/%E3%83%A9%E3%83%AB%E3%83%90%E3%82%AC%E3%83%81%E3%83%A3%E3%83%83%E3%82%AF</link>
    <pubDate>Tue, 06 Apr 2010 19:37:58 GMT</pubDate>
    <guid isPermaLink="false">dmscribbling.blog.shinobi.jp://entry/101</guid>
  </item>
    <item>
    <title>え</title>
    <description>
    <![CDATA[「外向的な人もいれば内向的な人もいる。内向的な人は他の得意分野で勝負すれば良い」<br />
これだけの話。優劣ではなく、向き不向きの問題。<br />
それを優劣の問題にすり替えたのが「コミュ力」ってやつなのかなあ、と思った。<br />
「コミュ力という点で、内向的な人は外向的な人に劣っているのです。だから鍛錬が必要です」<br />
トータルで見ろよ、と。分けてはいけないものを分けるから完璧超人が要請される。<br />
何の話だ。<br />
<br />
追記１<br />
<span style="font-weight: bold; color: rgb(32, 74, 135);">昴: </span>リセットによる爆アドでシールドリスクを吹っ飛ばすみたいな？<br />
<span style="font-weight: bold; color: rgb(32, 74, 135);">昴: </span>シールドを殴って手札を増加させてしまうリスク、を簡潔に表す言葉がそういえばなかったのでシールドリスクと呼んでみた<br />
<span style="font-weight: bold; color: rgb(32, 74, 135);">昴: </span>あとシールドトリガーのリスクも入ってるけど<br />
<br />]]>
    </description>
    <category>Articles</category>
    <link>https://dmscribbling.blog.shinobi.jp/articles/%E3%81%88</link>
    <pubDate>Tue, 06 Apr 2010 12:25:46 GMT</pubDate>
    <guid isPermaLink="false">dmscribbling.blog.shinobi.jp://entry/100</guid>
  </item>
    <item>
    <title>う</title>
    <description>
    <![CDATA[「前向き！前向きにいこうよ！ね？そんな暗い顔してないでさ。内向的なのは良くないよ。あんなこと言われたからって、くよくよしてちゃダメだよ。ほら元気出して、ね？そんな風に考えないで。楽しまなくちゃ負けだよ！あぁん、もう、だからそんなこと言ったらだめだってば。もっと前向きに！どうにもならないことを悩んだって仕方ないじゃない。・・・だからどうしてそういう風に考えるの？いい加減にしなさい。そんなこと普通は考えないよ？みんな楽しくやってるし、それが普通なんだから。あんただけよ？そんなグジグジしちゃってさ。馬鹿みたい。そんなんだからああいうこと言われるのよ。当たり前じゃない。このクズが。死んじゃえ。<br />
「だから・・・自分の殻にこもらないでって言ってるでしょう？クズって言われたくらいでそんなウジウジしちゃって、このウジ虫が。ああもう、またそうやって暗い顔する。もっと明るい顔をしてみなさいよ。ほら、いつまでもそんな格好してないで・・・だからどうしてそんなこと言うの！？自分のことをクズだなんて言うもんじゃないわよ！死んだほうがいいだなんてふざけないで！ウジ虫だなんて馬鹿じゃないの！？あんたみたいな奴を根暗って言うのよ！<br />
「私の言ってることがどうして分からないの？自分のことを根暗って言っちゃうその性格を直しなさいと言ってるのよ。前向き。前向きに生きなさいよ。人生楽しくないでしょう？まったくもう、周りに迷惑かけてるってのが分からないのかしらね。あんたみたいなのを見てるとこっちまで暗くなっちゃうわ。」<br />
<br />
「そう、それよ！やればできるじゃない。見直しちゃったわよ。一歩前に、踏み出せたじゃない。それでいいのよ。あんた変わったわね・・・前はあんなに暗かったのに。良かったじゃない、明るくなれて。<br />
「ところであんたの悩みって何だったかしら？」<br />
<br />]]>
    </description>
    <category>Articles</category>
    <link>https://dmscribbling.blog.shinobi.jp/articles/%E3%81%86</link>
    <pubDate>Tue, 09 Mar 2010 07:14:23 GMT</pubDate>
    <guid isPermaLink="false">dmscribbling.blog.shinobi.jp://entry/99</guid>
  </item>

    </channel>
</rss>