さて、これは数年間私を悩ませました。学校で統計学や高等数学に夢中になっている場合は、今すぐやめてください。遅すぎる。
わかった。深呼吸する。ルールは次のとおりです。2 つの30 面ダイス (はい、存在します) を取り、同時に転がします。
- 2 つの数字を足す
- 両方のサイコロが 5 以下または 26 以上の場合は、もう一度投げてその結果を自分の持っているものに追加します。
- 1 つが <= 5 で、もう 1 つが >= 26 の場合は、もう一度投げて、その結果を自分の持っているものから引きます。
- どちらかが > 5 かつ < 26 になるまで繰り返します!
いくつかのコードを記述し (以下を参照)、それらのサイコロを数百万回転がし、最終結果として各数字を受け取る頻度を数えると、1 の左側でかなり平坦な曲線が得られます。1 と 1 の間は約 45° です。 60 以上でフラット。30.5 以上になる確率は 50% 以上、18 以上になる確率は 80%、0 以上になる確率は 97% です。
ここで質問です:正確な値 f(x)、つまり特定の値をロールする確率を計算するプログラムを書くことは可能ですか?
背景: ロールプレイング ゲーム「Jungle of Stars」では、ランダムなイベントを抑える方法を探しました。上記のルールは、あなたが試みる何かに対してより安定した結果を保証します:)
オタク向けの Python のコードは次のとおりです。
import random
import sys
def OW60 ():
"""Do an open throw with a "60" sided dice"""
val = 0
sign = 1
while 1:
r1 = random.randint (1, 30)
r2 = random.randint (1, 30)
#print r1,r2
val = val + sign * (r1 + r2)
islow = 0
ishigh = 0
if r1 <= 5:
islow += 1
elif r1 >= 26:
ishigh += 1
if r2 <= 5:
islow += 1
elif r2 >= 26:
ishigh += 1
if islow == 2 or ishigh == 2:
sign = 1
elif islow == 1 and ishigh == 1:
sign = -1
else:
break
#print sign
#print val
return val
result = [0] * 2000
N = 100000
for i in range(N):
r = OW60()
x = r+1000
if x < 0:
print "Too low:",r
if i % 1000 == 0:
sys.stderr.write('%d\n' % i)
result[x] += 1
i = 0
while result[i] == 0:
i += 1
j = len(result) - 1
while result[j] == 0:
j -= 1
pSum = 0
# Lower Probability: The probability to throw this or less
# Higher Probability: The probability to throw this or higher
print "Result;Absolut Count;Probability;Lower Probability;Rel. Lower Probability;Higher Probability;Rel. Higher Probability;"
while i <= j:
pSum += result[i]
print '%d;%d;%.10f;%d;%.10f;%d;%.10f' % (i-1000, result[i], (float(result[i])/N), pSum, (float(pSum)/N), N-pSum, (float(N-pSum)/N))
i += 1