Комбинаторическая головоломка с подсчетом: бросьте 20 8-гранных кубиков, какова вероятность получить хотя бы 5 кубиков одинакового достоинства.

Представьте себе игру, в которой бросается 20 8-гранных кубиков, и общее количество возможных результатов составляет 8 ^ 20. Чтобы вычислить вероятность возникновения определенного события, мы делим количество способов, которыми это событие может произойти, на 8 ^ 20.

Можно подсчитать количество способов получить ровно 5 кубиков со значением 3. (20 выбирают 5) дает нам количество заказов 3. 7 ^ 15 дает нам количество способов, которыми мы не можем получить значение 3 для 15 бросков. .

number of ways to get exactly 5, 3's = (20 choose 5)*7^15.

Ответ также можно рассматривать как количество способов переставить строку 3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0 (20 выберите 5) умножить на общее количество значений, равных нулю (при условии 7 допустимых значений) 7 ^ 15 (это правильно).

  • Вопрос 1: Как я могу рассчитать количество способов получить ровно 5 кубиков одинакового достоинства (то есть для всех значений кубиков). Примечание: если я просто наивно воспользуюсь своим первым ответом выше и умножу bt 8, я получу огромное количество двойного счета?

    Я понимаю, что могу решить для каждого из случаев (5 единиц), (5, 2), (5, 3), ... (5, 8) суммировать их (проще говоря 8 * (5 единиц)). Затем вычтите сумму количества перекрытий (5 единиц) и (5 единиц), (5 единиц) и (5 единиц тройки) ... (5 единиц) и (5, 2) и ... и (5, 8). но это кажется чрезвычайно запутанным. Я хотел бы обобщить это таким образом, чтобы можно было масштабировать до большого количества выборок и большого количества классов.

  • Как я могу рассчитать количество способов получить хотя бы 5 кубиков одного достоинства?

    Итак, 111110000000000000000 или 11110100000000000002, или 11111100000001110000, или 11011211222222223333, но не 00001111222233334444 или 000511512252363347744.

Я ищу ответы, которые либо объясняют математику, либо указывают на библиотеку, которая поддерживает это (модули python esp). Дополнительные баллы за детали и примеры.


person Ethan Heilman    schedule 29.07.2009    source источник
comment
По теме: stackoverflow.com/questions/493239/   -  person Robert Harvey    schedule 29.07.2009


Ответы (7)


Двойной учет может быть решен с помощью принципа включения / исключения

Я подозреваю, что это связано с:

Choose(8,1)*P(one set of 5 Xs) 
- Choose(8,2)*P(a set of 5 Xs and a set of 5 Ys) 
+ Choose(8,3)*P(5 Xs, 5 Ys, 5 Zs) 
- Choose(8,4)*P(5 Xs, 5 Ys, 5 Zs, 5 As)

P(set of 5 Xs) = 20 Choose 5 * 7^15 / 8^20
P(5 Xs, 5 Ys) = 20 Choose 5,5 * 6^10 / 8^20

И так далее. Это не решает напрямую проблему «более 5 одинаковых», как если бы вы просто суммировали результаты, примененные к 5,6,7..20; вы бы переоценили случаи, когда у вас, скажем, 10 единиц и 5 восьмерок.

Вероятно, вы могли бы снова применить исключение включения, чтобы получить второй ответ; Итак, P (не менее 5) = P (один набор из 20) + ... + (P (один набор из 15) - 7 * P (набор из 5 из 5 кубиков)) + ((P (один набор из 14) - 7 * P (один набор из 5 из 6) - 7 * P (один набор из 6 из 6)). Придумывать исходный код для этого оказывается труднее.

person CoderTao    schedule 29.07.2009

Я предлагаю вам потратить немного времени на написание моделирования Монте-Карло и дать ему поработать, пока вы занимаетесь математикой вручную. Надеюсь, моделирование Монте-Карло сойдется до того, как вы закончите с математикой, и вы сможете проверить свое решение.

Чуть более быстрый вариант может включать создание SO-клона для математических вопросов.

person David Locke    schedule 29.07.2009
comment
+1 Надеюсь, есть и другие, кто увидит юмор в вашем ответе. :) - person Robert Harvey; 29.07.2009
comment
+1, смешно, и так клон по математике. Причина, по которой я пытаюсь дважды проверить результаты, - это написанная мной программа, которая генерирует то, что моделирует Монте-Карло. знак равно - person Ethan Heilman; 30.07.2009

Точное распределение вероятностей Fs, i суммы i s-сторонних игральных костей может быть вычислено как повторная свертка распределения вероятностей одиночных игральных костей с самим собой.

alt text

где alt textдля всех  alt text и 0 в противном случае.

http://en.wikipedia.org/wiki/Dice

person Robert Harvey    schedule 29.07.2009
comment
+1 хорошая ссылка, К сожалению, я ищу не сумму игральных костей, а количество повторений значений в последовательных бросках кубиков. То есть я бросаю кубик 10 раз, и это вероятность того, что я получу как минимум 3 кубика достоинством 5. - person Ethan Heilman; 29.07.2009

Эта проблема действительно сложна, если вам нужно ее обобщить (получить точную формулу).

Но в любом случае позвольте мне объяснить алгоритм. Если вы хотите знать

количество способов получить ровно 5 кубиков одного достоинства

вам нужно перефразировать вашу предыдущую проблему, как

подсчитайте количество способов получить ровно 5 кубиков значения 3 И никакое другое значение не может быть повторено ровно 5 раз

Для простоты назовем функцию F (20,8,5) (5 кубиков, все значения) первым ответом, а F (20,8,5,3) (5 кубиков, значение 3) - вторым. У нас есть, что F (20,8,5) = F (20,8,5,3) * 8 + (события, когда более одного значения повторяются 5 раз)

Итак, если мы можем получить F (20,8,5,3), это должно быть довольно просто, не так ли? Ну ... не очень ...

Во-первых, давайте определим некоторые переменные: X1, X2, X3 ..., Xi, где Xi = количество раз, когда мы получаем кубик i

Потом:

F(20,8,5)/20^8 = P(X1=5 or X2=5 or ... or X8=5, with R=20(rolls) and N=8(dice number))

, P (утверждение) - стандартный способ записи вероятности.

мы продолжаем:

F(20,8,5,3)/20^8 = P(X3=5 and X1<>5 and ... and X8<>5, R=20, N=8) 
F(20,8,5,3)/20^8 = 1 - P(X1=5 or X2=5 or X4=5 or X5=5 or X6=5 or X7=5 or X8=5, R=15, N=7)  
F(20,8,5,3)/20^8 = 1 - F(15,7,5)/7^15

рекурсивно:

F(15,8,5) = F(15,7,5,1) * 7  
P(X1=5 or X2=5 or X4=5 or X5=5 or X6=5 or X7=5 or X8=5, R=15, N=7) = P(X1=5 and X2<>5 and X4<>5 and .. and X8<>5. R=15, N=7) * 7

F(15,7,5,1)/7^15 = 1 - F(10,6,5)/6^10 F(10,6,5) = F(10,6,5,2) * 6

F(10,6,5,2)/6^10 = 1 - F(5,5,5)/5^5
F(5,5,5) = F(5,5,5,4) * 5

Что ж, тогда ... F (5,5,5,4) - это количество способов получить 5 кубиков номиналом 4 за 5 бросков, например, никакие другие кубики не повторяются 5 раз. Есть только 1 способ из 5 ^ 5. Тогда вероятность равна 1/5 ^ 5.

F (5,5,5) - это количество способов получить 5 кубиков любого достоинства (из 5 значений) за 5 бросков. Очевидно, 5. Тогда вероятность равна 5/5 ^ 5 = 1/5 ^ 4.

F (10,6,5,2) - это количество способов получить 5 кубиков достоинством 2 за 10 бросков, например, никакие другие кубики не повторяются 5 раз. F (10,6,5,2) = (1-F (5,5,5) / 5 ^ 5) * 6 ^ 10 = (1-1 / 5 ^ 4) * 6 ^ 10

Что ж ... Я думаю, что это может быть в какой-то мере неверно, но в любом случае, вы поняли. Надеюсь, мне удалось сделать алгоритм понятным.

edit: Я провел несколько проверок и понял, что вам нужно добавить несколько случаев, когда вы получаете более одного значения, повторяющегося ровно 5 раз. У тебя нет времени решать эту часть ...

person Francisco    schedule 29.07.2009
comment
+1, за ответ на первый вопрос. Есть идеи по второму? Что означает обозначение ‹›? - person Ethan Heilman; 30.07.2009

Вот о чем я думаю ...

Если бы у вас было всего 5 кубиков, у вас было бы только восемь способов получить желаемое.

Для каждого из этих восьми способов работают все возможные комбинации остальных 15 кубиков.

Итак - я думаю, что ответ: (8 * 8 15) / 8 20

(Ответ минимум на 5 одинаковый.)

person Anon    schedule 29.07.2009
comment
Он не считает последовательности, которые вышли из строя, поэтому он считает (11111000000000000000,11111000000000000002, 11111000000000000003, ... 111118888888888888, 22222000000000000000, 22222000000000000002, ... 22222888888888888888), но пропускает такие последовательности, как (0011111000000000000002011000000000000) Также обратите внимание, что по мере увеличения размера выборки вероятность столкновения остается фиксированной (8 * (8 ^ 15)) / (8 ^ 20) = 0,000244140625, (8 * (8 ^ 25)) / (8 ^ 30) = 0,000244140625, (8 * (8 ^ 95)) / (8 ^ 100) = 0,000244140625. - person Ethan Heilman; 30.07.2009
comment
@ e5: Я согласен, что мой числитель не учитывает разные порядки, но уверены ли вы, что ваш знаменатель учитывает? Рассмотрим два брошенных кубика вместо 20. Если вы хотите посчитать порядок, будет ли это 8 2 или вместо этого (2 * 8 2), чтобы учесть [red_die, blue_die] против [blue_die, red_die] ? - person Anon; 30.07.2009
comment
@Anon, интересный момент. Я думаю, что со мной все будет в порядке, хотя я определяю свои кубики по порядку, поэтому red_die всегда бросается первым, blue_die - вторым и так далее. - person Ethan Heilman; 30.07.2009
comment
@ e5: Тем не менее, ваше наблюдение за размером выборки опровергло мой ответ. Бросок 33 8-гранных игральных костей означает, что должно быть как минимум 5 из хотя бы одного числа. - person Anon; 30.07.2009

Я считаю, что вы можете использовать формулу x вхождений в n событиях как:

P = вероятность ^ n * (n! / ((N - x)! X!))

Таким образом, окончательный результат будет суммой результатов от 0 до n.

Я действительно не вижу простого способа объединить это в один шаг, который был бы менее беспорядочным. Таким образом, формула также будет прописана в коде. Однако вам, возможно, придется написать свой собственный факторный метод.

  float calculateProbability(int tosses, int atLeastNumber) {
    float atLeastProbability = 0;
    float eventProbability = Math.pow( 1.0/8.0, tosses);
    int nFactorial = factorial(tosses);

    for ( i = 1; i <= atLeastNumber; i++) {
      atLeastProbability += eventProbability * (nFactorial / (factorial(tosses - i) * factorial(i) );
    }
  }
person JonBWalsh    schedule 29.07.2009
comment
+1 математика, детали и исходный код. Ваше решение не работает, потому что учитываются только такие последовательности, как 11111000000000000 и 111000000001100. То есть 11111000000000000 и 11111000000000002 - разные последовательности, и каждая из них должна быть подсчитана. Например, если вы возьмете 40 проб (бросков), у вас должно быть хотя бы одно повторение из 5 (худший случай). Используемая вами формула этого не показывает. - person Ethan Heilman; 30.07.2009
comment
Не думаю, что слежу за твоим комментарием. Вес 1/8 для положительного события (выпадение определенного числа) покрывает это. В двух ситуациях возможные результаты A: 1 2 3 4 5 6 и 1 0 0 0 0 0 функционально идентичны, если нас не интересуют «не-единицы» значения. Также я не думаю, что OP запрашивает вероятность того, что хотя бы X кубиков будет иметь одинаковое значение ЛЮБОГО значения (которое отличается). Насколько я понимаю, он хочет знать вероятность того, что по крайней мере x многие умрут, имея значение y. - person JonBWalsh; 30.07.2009
comment
Lol nm Я вижу, что вы ОП. Если вы хотите спросить, какова вероятность того, что хотя бы X умирает с одинаковым числом ЛЮБОГО числа, вы можете перефразировать исходный вопрос, поскольку он неясен. Поскольку вы начинаете говорить о количестве комбинаций, в которых есть не менее 5 троек, люди думают, что вы говорите о вероятности того, что x умрет, имея значение y. - person JonBWalsh; 30.07.2009
comment
@JonBWalsh, хороший момент, я уточняю вопрос. Извините за путаницу. - person Ethan Heilman; 30.07.2009

Рекурсивное решение:

Prob_same_value(n) = Prob_same_value(n-1) * (1 - Prob_noone_rolling_that_value(N-(n-1)))
person mbeckish    schedule 29.07.2009
comment
Рекурсивный метод хорош, но часто ускользает от меня. Я не уверен, что понимаю, как работает ваш алгоритм, что такое n? Что предоставляет Prob_same_value (2)? 1/8? - person Ethan Heilman; 29.07.2009
comment
Да, я просто выбросил это без особых подробностей. По сути, я говорю, что для того, чтобы получить хотя бы пять одинаковых кубиков, вам нужно получить 4 одинаковых значения, и вам НЕ нужно, чтобы ни один из других кубиков не соответствовал этим 4. - person mbeckish; 29.07.2009
comment
n - сколько кубиков должно бросить одно и то же значение. Итак, Prob_same_value (1) = Prob_same_value (2) = Prob_same_value (3) = 1. После этого решите рекурсивно. - person mbeckish; 30.07.2009
comment
Не считая последовательностей, в которых 5 повторений вышли из строя. Он не считает последовательности, которые вышли из строя, поэтому он считает (11111000000000000000,11111000000000000002, 11111000000000000003, ... 111118888888888888, 22222000000000000000, 22222000000000000002, ... 22222888888888888888), но пропускает такие последовательности, как (0011111000000000000002011000000000000) - person Ethan Heilman; 30.07.2009
comment
@ e5 - Нет, здесь нет упоминания о порядке. Чтобы получить ЛЮБЫЕ 5 совпадений, вы должны собрать ЛЮБЫЕ 4 совпадения и получить еще хотя бы 1 кубик для совпадения. - person mbeckish; 30.07.2009
comment
@mbeckish, (1/8) подразумевает порядок, поскольку вероятность для набора бросков кубиков не равна (1/8) ^ rolls, если порядок не учитывается. - person Ethan Heilman; 30.07.2009
comment
Хорошая мысль, я перепутал этот вопрос с одним из других, давайте подумаем над этим еще немного. - person Ethan Heilman; 30.07.2009
comment
@mbeckish - я подумал над твоим ответом, и теперь я уловил твою интуицию, которая, я могу добавить, действительно довольно умна. Этот тип рекурсии поддается решению динамического программирования (отличная эффективность) и / или компромиссу с памятью. Я не уверен, что происходит с Prob_noone_rolling_that_value (N- (n-1))? Какое отношение имеет N к n? Типа? Разве не должно (n- (n-1)) = 1 для всех n? Является ли N начальным, а не рекурсивным значением n? Вы имели в виду (n! - (n-1))? Тем не менее, отличный ответ, если бы у меня было больше одного голоса. - person Ethan Heilman; 02.08.2009