[抱負]

ダブルクロスの達成値の平均値を求めるプログラムをschemeで書く、です。

同様に、能力値2、技能0、クリティカル値11(クリティカルしない)、エフェクトは使用しないケース。

とりあえず、この場合の組み合わせを列挙してみる。

  1 2 3 4 5 6 7 8 9 10
1 1 2 3 4 5 6 7 8 9 10
2 2 2 3 4 5 6 7 8 9 10
3 3 3 3 4 5 6 7 8 9 10
4 4 4 4 4 5 6 7 8 9 10
5 5 5 5 5 5 6 7 8 9 10
6 6 6 6 6 6 6 7 8 9 10
7 7 7 7 7 7 7 7 8 9 10
8 8 8 8 8 8 8 8 8 9 10
9 9 9 9 9 9 9 9 9 9 10
10 10 10 10 10 10 10 10 10 10 10

振ったダイスの大きい方の目を選択するので、上記の様になる。
この各項目の平均値がこのケースでの平均値であるから、

(-
 (/
  (+ 1  2  3  4  5  6  7  8  9 10
	 2  2  3  4  5  6  7  8  9 10
	 3  3  3  4  5  6  7  8  9 10
	 4  4  4  4  5  6  7  8  9 10
	 5  5  5  5  5  6  7  8  9 10
	 6  6  6  6  6  6  7  8  9 10
	 7  7  7  7  7  7  7  8  9 10
	 8  8  8  8  8  8  8  8  9 10
	 9  9  9  9  9  9  9  9  9 10
	 10 10 10 10 10 10 10 10 10 10 )
  100.0
  )
 (/ 1 100.0)  ; ファンブル時の分は減算する
 )

;=>7.140000000000001

となる。
この時、それぞれの目が選択されるケースの確率を考えてみる。
1の場合はとりあえず飛ばして、2が選択されるケース。

  1 2 3 4 5 6 7 8 9 10
1 1 2 3 4 5 6 7 8 9 10
2 2 2 3 4 5 6 7 8 9 10
3 3 3 3 4 5 6 7 8 9 10
4 4 4 4 4 5 6 7 8 9 10
5 5 5 5 5 5 6 7 8 9 10
6 6 6 6 6 6 6 7 8 9 10
7 7 7 7 7 7 7 7 8 9 10
8 8 8 8 8 8 8 8 8 9 10
9 9 9 9 9 9 9 9 9 9 10
10 10 10 10 10 10 10 10 10 10 10

図のように、赤い箇所から青い箇所を引いた数になる。
3の場合はこんな感じ。

  1 2 3 4 5 6 7 8 9 10
1 1 2 3 4 5 6 7 8 9 10
2 2 2 3 4 5 6 7 8 9 10
3 3 3 3 4 5 6 7 8 9 10
4 4 4 4 4 5 6 7 8 9 10
5 5 5 5 5 5 6 7 8 9 10
6 6 6 6 6 6 6 7 8 9 10
7 7 7 7 7 7 7 7 8 9 10
8 8 8 8 8 8 8 8 8 9 10
9 9 9 9 9 9 9 9 9 9 10
10 10 10 10 10 10 10 10 10 10 10

この赤い箇所の求め方は、赤い箇所と青い箇所の面積-青い箇所の面積なので、
求めるケースの二乗−(求めるケース−1)の二乗、となる。
2の場合は

(- (expt 2 2) (expt (- 2 1) 2))
; => 3

3の場合は

(- (expt 3 2) (expt (- 3 1) 2))
; => 5

である。

一般化するとこんな感じ。

(- (expt n 2) (expt (- n 1) 2))	; nは求める目

こうして求まるのが各目のでるケース数なので、これを全ての組み合わせの総数(100)で割ると、その目の出る確率になる。

(define (roll-2dice-nocr)
  (-
   (apply +
		  (map (lambda (n)
				 (* (/ (- (expt n 2) (expt (- n 1) 2)) (expt 10.0 2)) n)
				 )
			   '(1 2 3 4 5 6 7 8 9 10))
		  )
   (/ 1 (expt 10.0 2))
   ))
(roll-2dice-nocr)
;=> 7.140000000000001

明日に続く。
…っつーか忘れて昨日の日記に書いてた(今日は既に十八日)。