• БлэкДжек, вероятность комбинации, как посчитать?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Проблема у вас, похоже, что разные комбинации можно получить с разными вероятностями.

    Допустим, 19 = 2+2+5+5+5. Но можно же переставлять карты местами. Ведь диллеру могли прийти 5, потом вторая 5, потом 2, потом 2, потом 5. Да и сами пятерки могли прийти 3! способами. Однако, вы не можете поставить 2 последней, потому что сумма четырех первых карт уже 17. Диллер бы не тянул эту последнюю двойку.

    Но 19=3+3+4+4+5 уже можно выбрать всеми 5! разными способами. Поэтому эти 2 комбинации, хоть и дают одну и ту же сумму и содержат одинаковое количество карт, можно получить с разной вероятностью.

    Правильное решение с применением динамического программирования:

    Во-первых, переберите, какая карта будет вытянута последней. Найдите вероятности всех сумм с учетом этой карты (так, что она переваливает сумму за 17, но не пердыдущая). Потом просуммируйте по всем таким картам.

    Исключите эту последнюю карту из колоды. Теперь надо найти сколько наборов карт заданной длины дают каждую сумму < 17. При этом при подсчете вероятности можно переставлять все эти карты как угодно. Поэтому имеет значение, сколько карт мы использовали для суммы.

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

    При подсчете у вас есть 2 варианта - последняя из k карт или входит, или нет в сумму (допустим массив a[] хранит веса карт).
    Т.е. F(n,k,s) = F(n,k-1,s)+F(n-1,k-1,s-a[k]).

    База:
    F(0, k, s) = 1 если s==0; 0 иначе
    F(n,0,s) = 1 если n==0 и s==0; 0 иначе.
    F(n, k, s<0) = 0

    Можно сэкономить на памяти и считать в двумерном массиве с конца в начало, выкинув k (второй параметр).

    Потом искомая вероятность набрать сумму x c последней картой l, если осталось в колоде max_k карт (если x<17+l, x>=17, иначе - вероятность 0):

    P(x) = sum_{n=1..max_k} f(n, max_k, x-l) * n! * (max_k-n)! / (max_k+1)!

    Тут перебор по всем возможным количествам карт у диллера. Дальше берем количество способов набрать нужную сумму из ДП. Потом домножаем на n!, потому что эти карты в руке у диллера могли прийти в любом порядке. Дальше домножаем на вероятность вытянуть конкретные n+1 карт (считая последнюю) из колоды с max_k+1 картами. Это 1/(max_k+1)/max_k/,,,/(max_k-n+1) = (max_k-n)!/(max_k+1)!

    Этот множитель после f() можно пересчитывать за одно домножение и деление
    при увеличении n.

    Напоминаю, это надо просуммировать по всем возможным картам взятым за l, заново прогоняя ДП.
    Ответ написан
    3 комментария
  • Xamarin для IOS и Android?

    @relov
    Разрабатываю на c#
    Отвечу за Xamarin Forms
    1. Для андройд есть эмуляторы, для ios есть симуляторы, но нужен мак в качестве билд сервера. Возможна отладка удаленно из windows. Так же есть новая фича Hot restart, позволяющая собрать и дебажить приложение на айфоне без мака (пока в превью со всеми вытекающими)
    2. UI и бизнес логика пишется один раз, отдельно пишутся специфичные для платформы вещи (рендеры, фоновые сервисы итд).
    3. Все зависит от разработчика. То что вы описали можно реализовать не влезая в нативный проект, средствами Xamarin Forms и уже готовых плагинов. В случае чего можно без особых проблем писать платформозависимый код и использовать все те возможности которые доступны для нативных разработчиков, но только на языке C#.
    4. Зависит от дизайна и опыта исполнителя, но как показывает практика такое возможно.
    Ответ написан
    Комментировать
  • Xamarin для IOS и Android?

    DevMan
    @DevMan
    1. есть. но для яоси нужен мак.
    2. зависит от вас. обычно бОльшая часть кода одна.
    3. в принципе нет. но бывает, что нужного бриджа нет и приходится прибегать к нативу.
    4. у каждой системы свои гайдлайны по гуи и свое представление о том как должны выглядеть/вести контролы. поэтому есть смысл заморачиваться с дизайном под каждую платформу.
    Ответ написан
    4 комментария