Вы получите 13
, потому что это правильный результат.Немного математики: если S
является случайной величиной, представляющей счет в любой из этих игр, то вы можете рассмотреть функцию генерации вероятности f(z)
из S
.Исходя из описания игры, эта функция, генерирующая вероятность, удовлетворяет уравнению:
f(z) = (z + z^2 + z^3 + z^4 + z^5 + z^6) / 36 + f(z)(z + z^2 + z^3 + z^4 + z^5) / 6
Это требует некоторого размышления или знакомства с такой конструкцией: левый терминс правой стороны учитывает вероятности получения от 1 до 6 в простой игре с 2 бросками;правое слагаемое, включающее f (z), учитывает игры с участием 3 или более бросков, выражая их в терминах финального броска до 6 (который должен быть в диапазоне от 1 до 5) и предыдущих бросков, вероятности которых мыможно рекурсивно выразить, используя f
снова.
В любом случае, пройдя этот путь, можно перегруппировать, описать f
как рациональную функцию z
, а затем расширить как степенной ряд, который начинается:
f(z) = 1/36*z + 7/216*z^2 + 49/1296*z^3 + 343/7776*z^4 + 2401/46656*z^5 + 16807/279936*z^6 + 63217/1679616*z^7 + 388087/10077696*z^8 + 2335585/60466176*z^9 + 13681927/362797056*z^10 + 77103313/2176782336*z^11 + 409031959/13060694016*z^12 + 2371648321/78364164096*z^13 + 13583773735/470184984576*z^14 + ...
(я использовал Пари / ГП , чтобы получить это.)
Затем коэффициент z^k
описывает вероятностьстоимость игры k
;таким образом, есть шанс 1 к 36 при счете 1, шанс 7 к 216 получить 2 и так далее.Сумма первых 12 коэффициентов равна 0.472828864487196328...
, а сумма первых 13 коэффициентов равна 0.5030933144224321950968...
.Таким образом, медиана действительно равна 13.
Чтобы обеспечить независимую проверку, я написал небольшую программу на Python:
from __future__ import division
import random
def roll():
return random.randint(1, 6)
def play():
score = roll()
while True:
throw = roll()
if throw == 6:
break
score += throw
return score
all_scores = sorted(play() for _ in xrange(1000001))
print "median is: ",all_scores[len(all_scores) // 2]
print "fraction of scores <= 12: ",all_scores.index(13) / len(all_scores)
print "fraction of scores <= 13: ",all_scores.index(14) / len(all_scores)
Конечно, вот результаты:
iwasawa:~ mdickinson$ python dice_game.py
median is: 13
fraction of scores <= 12: 0.472811527188
fraction of scores <= 13: 0.502863497137
Итак, чтобы ответить на ваш вопрос, результаты, которые вы видите, не свидетельствуют о какой-либо слабости в генерации случайных чисел в Java.