Welcome to my blog

独自調査

【スロット?】【VBA?】設定判別ツールの作り方 その2 ・・・ 精度の悪いけど、オーバーフロー対策した二項分布

<tt>深緑の女魔術師です。

えらい間空いてしまったよ。

自前の設定判別ツールでも作ろう!なんて思ってたけど、放置してました。
前回躓いたのは、あまりに大きな数値を計算するため故に、オーバーフローしてどうしましょうか?

で止まってました。

こないだは、対策しようとして大きくなったら一旦小さくしよう!ってことでやってました。

が、方針が悪過ぎましたね。
何故に、頭から計算して大きくなる度に削ったのか??

それのせいで半端なく精度を落とすこになってました。

少し考えて以下に落ちつきました。

とりあえず、VBAです。
(JavaScriptにあんまり慣れてないので、コーティングに時間かかるため)

方針は、二項分布の計算を1ずつ増やしたイメージでそれぞれ掛け算して、
途中で10の10乗で割るなり掛け算して、オーバーフローしないようにしましょうね。
って流れです。

以下で計算すると、実際のExcelの関数とで10^18乗ぐらいまでの誤差で得られます。
これが誤差範囲と言っていいのかどうか分かりません。
物理屋さん故に、ほぼ一致レベルの数字だし、桁数もあってるので誤差だと思ってます。

※とりあえず書いてみたレベルなので、バグがあるかも知れませんので、使用する場合は自己責任でお願いします。
 また、見直しぐらいしようよレベルの同じIf文がならんでますがノークレームで!

以下、コード

Sub NiKou()

''-----------------
''変数宣言
''-----------------
Dim HtRt As Double ''成功回数
Dim MsRt As Double ''試行回数
Dim HtCt As Double ''失敗回数
Dim MsCt As Double ''成功確率
Dim SmCt As Long ''失敗確率
Dim Ans As Double ''計算結果(確率)
Dim X As Long ''ワーク
Dim WkTen10 As Integer ''10^10 or 10^-10の個数

''-----------------
''初期化
''-----------------
WkTen10 = 0
Ans = 1

''-----------------
''データ(仮のテストデータ)
''-----------------
HtCt = 10 ''成功回数(ベル回数)
SmCt = 100 ''試行回数(総回転数)
MsCt = SmCt - HtCt ''失敗回数(ベル以外の回数)
HtRt = 1 / 10 ''成功確率(ベル確率)
MsRt = 1 - HtRt ''失敗確率

''-----------------
''式
''-----------------
'' 確率 =
'' 試行回数 C 失敗回数(組み合わせ)
'' * (成功確率) ^ 成功回数
'' * (失敗確率) ^ 失敗回数


''-----------------
''計算処理
''-----------------
For X = 1 To SmCt
''組み合わせ計算
If X <= HtCt Then
''分子
Ans = Ans * (SmCt + 1 - X)
End If
If X <= HtCt Then
''分母
Ans = Ans / X
End If
''(成功確率) ^ 成功回数
If X <= HtCt Then
Ans = Ans * HtRt
End If
''(失敗確率) ^ 失敗回数
If X <= MsCt Then
Ans = Ans * MsRt
End If

''オーバーフロー対策
If Ans >= 10 ^ 10 Then
Ans = Ans / 10 ^ 10
WkTen10 = WkTen10 + 1
ElseIf Ans <= 10 ^ (-10) Then
Ans = Ans * 10 ^ 10
WkTen10 = WkTen10 - 1
End If
Next

''帳尻合わせ
Ans = Ans * (10 ^ (-10)) ^ Abs(WkTen10)

Msgbox(Ans)

End Sub


あとはこれをJavaScriptに埋め込めば??

以上


関連記事
スポンサーサイト
最後まで読んでくれてありがとう!

拍手うれしいです・・・

 
深緑の女魔術師設定判別ツールVBA

0 Comments

There are no comments yet.

Leave a reply