gpt4 book ai didi

java - 计算二十一点中经销商破坏 S17 的概率

转载 作者:行者123 更新时间:2023-11-30 10:08:17 25 4
gpt4 key购买 nike

我正在为大学编写一个 Java 项目,我要从数学的角度探索二十一点。现在,我偶然发现了 8 副牌在发牌盒中爆牌的可能性(取决于公开牌)。

odds

所以我通过数百万次模拟得到了这些结果(每个时间套牌都是不同的,完整的和重新洗牌的)。如您所见,我通过我的应用程序获得的几率和正确的(来自 wizardofodds.com 网站)两个 非常相似九个。但是 TENACE 有问题。差异太大了,不容忽视。那么有人可以向我解释我错过了什么吗?

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

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

主类

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

Deck 类的一部分

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

卡片类的一部分

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

值类的一部分

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

最佳答案

您比较的概率源自假设(根据典型的美国规则),庄家没有自然概率。在典型的美式游戏中,当庄家的明牌是 A 时,底牌不能是 10;并且当明牌是十时,底牌不能是A。

如果您仍然对获得匹配结果感兴趣,可以使用以下条件概率公式:

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

关于java - 计算二十一点中经销商破坏 S17 的概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53807603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com