计算二十一点中经销商销毁S17的概率

时间:2018-12-17 00:06:32

标签: java statistics blackjack

我正在为大学编写一个Java项目,我将从数学的角度探索二十一点。现在,我偶然发现发牌者在鞋中放置了8副牌的可能性(取决于补牌)。

odds

因此,我通过数百万次仿真得到了这些结果(每个时区都是不同的,完整的和改组的)。如您所见,我在应用程序中获得的赔率和(从wizardofodds.com网站获得的赔率)两次到< strong> NINE 。但是 TEN ACE 存在问题。差异实在太大了,不容忽视。所以有人可以向我解释我在想什么吗?

下面,我已为此问题附上了必要的源代码(从不相关的类中排除了很多其他方法)

非常感谢您的帮助。预先感谢您阅读本文。

主班

web.config

属于Deck类

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;
}

Hand类的一部分

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;
    }
}

属于卡片类

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;
    }
}

Value类的一部分

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);
    }
}

3 个答案:

答案 0 :(得分:2)

您要比较的概率是根据(根据典型的美国规则)经销商没有自然条件的假设得出的。在典型的美国游戏中,当发牌人的上位牌为Ace时,底牌不能为10。当upcard为10时,底牌不能为Ace。

如果您仍然希望获得匹配结果,则可以使用以下条件概率公式:

Q[bust] = P[bust] / (1 - P[bj])

其中

  • Q是经销商在美国规则下的概率(注意Q[bj]=0);
  • P是经销商在欧盟规则下的概率。

根据https://wizardofodds.com/games/blackjack/dealer-odds-blackjack-european-rules(8个套牌):

  • P[bj|upcard=Ace]=0.308434
  • P[bj|upcard=10]=0.0771084

答案 1 :(得分:1)

一切看起来不错,但是您缺少一个专门处理A的案例。

  

在大多数桌子上,发牌者还会击中“软” 17,即一手包含一张王牌和一张或多张其他纸牌,总计六张。

来自wikipedia.org/wiki/Blackjack

因为您总是每17站一次,您的破获几率就会降低。

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

这在每种情况下都会影响赔率,尽管很有趣,它对10年代有这种影响。所以可能不是唯一的问题。

答案 2 :(得分:0)

我的天哪。似乎一切正确。 我只是看着奇怪的桌子。 不再确定https://wizardofodds.com/games/blackjack/side-bets/bet-the-bust/是什么,但是与https://wizardofodds.com/games/blackjack/appendix/2b/相比,它看起来还不错。

对不起。感谢所有试图帮助我的人。