2012-02-25

クリティカルヒットの確率

クリティカルヒットの確率ってどう計算されているのかなーと。一様分布でもいいけどそうすると乱数が偏った時に "出すぎる" とか "でない" という現象が起こってしまうし。ポアソン過程だと思ったらいいのかなーとかと思ってぼんやり考えていたんですが。
放射性元素の時間あたりの崩壊数、一定時間における電話の呼びは離散的確率過程でありポアソン過程として知られている。単位時間に偶発事象が平均して l 回起こる場合に、k 回発生する確率は
P(k) = l**k exp(-l) / k!
ほて、攻撃 10 回(単位回数)に対して 1 回程度発生する crit の発生判定をするとして、 l = 1/10 = 0.1 から P(k) = 0.1**k exp(-0.1) / k! としてやると、
  • 10 回のうち 0 回発生する確率
    P(0) = 1 exp(-0.1) / 1     = exp(-0.1)         ~ 0.90
  • 10 回のうち 1 回発生する確率
    P(1) = 0.1 exp(-0.1) / 1     = 0.1 exp(-0.1)     ~ 0.090
  • 10 回のうち 2 回発生する確率
    P(2) = 0.1**2 exp(-0.1) / 2! = 0.01 exp(-0.1)/2  ~ 0.0045
  • 10 回のうち 3 回発生する確率
    P(3) = 0.1**3 exp(-0.1) / 3! = 0.001 exp(-0.1)/6 ~ 0.00015
となるので、過去 9(=10 - 1) 回の攻撃のうち n 回 crit が発生しており、次に crit が発生する確率は P(n+1) で計算して判定すればいい?のかなーと思ったりした。初回の確率(n=0) P(0+1) が 9%、まあ 10% ぐらいになるので感覚的にもだいたい合っているし。
しかし、実用的には階乗計算はあんまりでかい数を使うとすぐオーバーフローしてしまいますし、そもそも [0,1) の数を何乗もすると値が極端に小さくなるので、"単位回数"はせいぜい 10 回ぐらいになるんでしょうか。過去何回のうち何度出たかみたいなのを記憶するのも割りとアレです。
実際のゲームどうなってるんでしょー

参考文献
  • 中川正雄、真壁利明:確率過程,培風館,2002

2012-02-17

Impatience

切羽詰まった時にこそ別のことをしたくなるのです。実は今週の水曜ごろまで昼夜逆転で(いや厳密に言うと昼間は学校でプレゼンしたり色々していたので違うのですが)レポートやらなんやらをやっつけていたのですが、そのときに片手間に書き始めたものです。
焦っていたので「焦燥」という名前にしておきます。もっとも、名前は管理の都合でつけているだけなので深い意味はないのですが。
例によって例のごとくベタ打ちですが、チェンバロにしているのでわりと様になってる気がします。ト短調ですが途中何回か転調してイ短調で終わります。バロックと古典派とポピュラーを足して割った感じの構成だと思ってますがいかに。

2012-02-11

DrawingArea のダブルバッファリング

まあぼくがドキュメントちゃんと読んでなかったからなのですが。
Cairo で描画するときに激しくちらついたのでなんでだろーと思ったらダブルバッファリングのためのメソッドを呼んでやってなかったという間抜けです。なんせ DrawingArea なんて使うの初めてですし。
DrawingArea.GdkWindow.BeginPaintRect あたりを描画前に呼んでやって、DrawingArea.GdkWindow.EndPaint を終わったら呼べばいいみたいです。