Хорошо, это прослушивало меня уже несколько лет. Если вы сосали статистику и высшую математику в школе, отвратитесь, сейчас. Слишком поздно.Вычислите точный результат сложного броска двух D30
Хорошо. Сделайте глубокий вдох. Вот правила. Возьмите два тридцатисторонних кубика (да, they do exist) и сверните их одновременно.
- Добавить два номера
- Если оба кубика показывают < = 5 или> = 26, бросить снова и добавить результатом того, что у вас есть
- Если один < = 5, а другая> = 26, бросить снова и вычесть результат из у вас есть
- Повторяйте до тех пор, пока не будет> 5 и < 26!
Если вы напишете какой-нибудь код (см. Ниже), сверните эти кости несколько миллионов раз, и вы рассчитываете, как часто вы получаете каждое число в качестве конечного результата, вы получаете кривую, которая довольно плоская слева от 1, вокруг 45 ° градусов между 1 и 60 и плоскими выше 60. Вероятность прокатки 30,5 или выше составляет более 50%, для прокатки лучше 18 составляет 80%, а для прокатки лучше, чем 0, составляет 97%.
Теперь вопрос: можно ли написать программу стоимоститочного значения f (х), то есть вероятность того, катиться определенным значением?
Справочная информация. Для нашей ролевой игры «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
Кривая, которую вы описываете, является кумулятивной вероятностью. Интересна кривая плотности вероятности для этих данных. Он имеет два ясных вершины (один на 26 и один на 36), с долиной в средней точке (31). Только это заставляет меня думать, что ваш ответ будет трудно определить! – 2008-11-19 22:41:08
Я знаю :) Я уже обращался к профессорам за статистикой, и они не могли придумать ответа ... – 2008-11-20 07:54:32
, который должен был быть «двумя профессорами» – 2008-11-20 07:58:13