好吧,这困扰了我好几年,现在。如果你在学校学过统计学和高等数学,现在就转身离开。太晚了。
好的。深吸一口气。这是规则。拿两个30 面骰子(是的,它们确实存在)并同时掷骰子。
- 将两个数字相加
- 如果两个骰子都显示 <= 5 或 >= 26,再次掷骰子并将结果添加到您所拥有的
- 如果一个是 <= 5 而另一个 >= 26,则再次抛出并从你拥有的结果中减去结果
- 重复直到 > 5 和 < 26!
如果您编写一些代码(见下文),将这些骰子掷几百万次,然后计算您收到每个数字的频率作为最终结果,您会得到一条在 1 的左侧非常平坦的曲线,在 1 和 1 之间大约 45° 60和60以上持平。滚动30.5或更好的机会大于50%,滚动优于18的机会是80%,滚动优于0的机会是97%。
现在的问题是:是否可以编写一个程序来计算精确值 f(x),即滚动某个值的概率?
背景:对于我们的角色扮演游戏“星辰丛林”,我们寻找一种方法来控制随机事件。上面的规则保证了你尝试的东西会得到更稳定的结果:)
对于周围的极客,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