Я пытаюсь рассчитать распределение шансов меняющегося числа 6-ти сторонних бросков кубика.Например, 3d6 варьируется от 3 до 18 следующим образом:
3:1, 4:3, 5:6, 6:10, 7:15, 8:21, 9:25, 10:27, 11:27, 12:25, 13:21, 14:15, 15:10, 16:6, 17:3, 18:1
Я написал эту программу php для ее вычисления:
function distributionCalc($numberDice,$sides=6) {
for ( $i=0; $i<pow($sides,$numberDice); $i++)
{
$sum=0;
for ($j=0; $j<$numberDice; $j++)
{ $sum+=(1+(floor($i/pow($sides,$j))) % $sides); }
$distribution[$sum]++;
}
return $distribution;
}
Внутренний цикл $ j for использует магию floor и modulus функционируют для создания счетной последовательности base-6 с количеством цифр, равным числу игральных костей, поэтому 3d6 будет считаться:
111,112,113,114,115,116,121,122,123,124,125,126,131,etc.
Функция берет сумму каждого, поэтому она будет выглядеть следующим образом: 3,4,5,6,7,8,4,5,6,7,8,9,5 и т. Д.Он просматривает все 6 ^ 3 возможных результатов и добавляет 1 к соответствующему интервалу в массиве $ distribution между 3 и 18. Довольно просто.Тем не менее, он работает только до 8d6, после чего я получаю тайм-ауты сервера, потому что теперь он выполняет миллиарды вычислений.
Но я не думаю, что это необходимо, потому что вероятность умирает за милым распределением по кривой.Мне интересно, есть ли способ пропустить сжатие числа и перейти прямо к самой кривой.Есть ли способ сделать это, например, с 80d6 (диапазон: 80-480)?Можно ли спроецировать распределение без выполнения 6 ^ 80 вычислений?
Я не профессиональный кодер, и вероятность для меня все еще нова, поэтому спасибо за всю помощь!
Стивен