Расчет вероятности разорения дилера S17 в блэкджеке - PullRequest
0 голосов
/ 17 декабря 2018

Я пишу Java-проект для университета, где изучаю блэкджек с математической точки зрения.Прямо сейчас я наткнулся на вероятность того, что дилер разорится (в зависимости от карты) для 8 колод в колоде.

odds

Так что я получил эти результаты через миллионысимуляции (каждая колода разная, полная и перетасованная).Как вы можете видеть, шансы, которые я получил с помощью моего приложения и правильные (с сайта wizardofodds.com ) очень похожи на TWO ДЕВЯТЬ .Но что-то не так с TEN и ACE .Разница слишком велика, чтобы ее игнорировать.Так может кто-нибудь объяснить мне, что мне не хватает?

Ниже я приложил необходимые исходные коды для этой проблемы (я исключил множество других методов из классов, которые не связаны) .

Буду очень признателен за любую помощь.Заранее благодарим за прочтение этого.

Основной класс

public static void main(String[] args) {
    for (Value value : Value.values()) 
        Card card = new Card(value);
        int range = 1_000_000;
        long res = IntStream.range(0, range).sequential().filter(e -> isBusted(card)).count();
        System.out.println(value + "\t" + res * 1.0 / range);
    }
}

public static boolean isBusted(Card card) {
    Deck deck = new Deck();
    deck.init(8);
    Hand hand = new Hand(card);
    while (hand.points() < 17) {
        hand.add(deck.draw());
    }
    return hand.points() > 21;
}

Часть класса Палуба

public class Deck {
    private ArrayList<Card> cards;

    public Deck() {
        cards = new ArrayList<>();
        init(8);
    }

    public void init(int size) {
        cards.clear();
        for (int i = 0; i < size; i++) {
            for (Suit suit : Suit.values()) {
                for (Value value : Value.values()) {
                    cards.add(new Card(suit, value));
                }
            }
        }
        Collections.shuffle(cards);
    }

    public Card draw() {
        Card card = cards.get(0);
        cards.remove(card);
        return card;
    }
}

Часть класса Hand

public class Hand {
    private ArrayList<Card> cards;

    public Hand(Card... cards) {
        this.cards = new ArrayList<>(Arrays.asList(cards));
    }

    public void add(Card card) {
        this.cards.add(card);
    }

    public int countAces() {
        return (int) cards.stream().filter(Card::isAce).count();
    }

    public int points() {
        int points = cards.stream().mapToInt(e -> e.value().points()).sum();
        for (int i = 0; i < countAces(); i++) {
            points += (points >= 11) ? 1 : 11;
        }
        return points;
    }
}

Часть класса Card

public class Card {
    private Suit suit;
    private Value value;

    public Card(Value value) {
        this.suit = Suit.CLUBS;
        this.value = value;
    }

    public Value value() {
        return value;
    }

    public boolean isAce() {
        return value.equals(Value.ACE);
    }
}

Часть класса Value

public enum Value {
    TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE;

    public int points() {
        if (ordinal() <= 7) {
            return ordinal() + 2;
        }
        if (ordinal() >= 8 && ordinal() <= 11) {
            return 10;
        } else {
            return 0;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Боже мой.Кажется, все правильно.Я просто смотрел на странный стол с коэффициентами.Больше не уверен, что такое https://wizardofodds.com/games/blackjack/side-bets/bet-the-bust/,, но по сравнению с https://wizardofodds.com/games/blackjack/appendix/2b/ выглядит довольно хорошо.

Извините.Спасибо всем, кто пытался мне помочь.

0 голосов
/ 17 декабря 2018

Все выглядит хорошо, но вы упускаете кейс, в котором конкретно рассматриваются тузы.

На большинстве столов дилер также бьет по "мягкому" 17, то есть руке, содержащей туза иодна или несколько других карт на общую сумму шесть.

С wikipedia.org / wiki / Blackjack .

Поскольку вы всегда останавливаетесь на каждые 17, у вас будет меньшешансы перебора.

while (hand.points() < 17 || hand.soft17()) {
    hand.add(deck.draw());
}

Это повлияло бы на шансы в каждом случае, хотя забавно, что это влияет на 10 секунд.Так что, возможно, не единственная проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...