2016-05-23 7 views
0

私は、バカラの試合ですべての可能なハンドを列挙するためのコードを書いています。問題は、結果が2つの別々の場所の結果と異なることです。これは、お互いにも同意します。ここでバカラゲームのシミュレーション

がオンラインで見つけるの答えです:

バンカーは0.458597
プレーヤーは0.446247
タイ0.095156

wizard of odds
reviewpokerrooms.com/casino-games/baccarat/odds-calculator.html勝を獲得します

enumBaccarat()関数のログはhereです。

度P:ここ

はenumBaccarat()関数からの結果である48074、B:44955トン:10382 度ProbのP:0.44770758239239270625523092341969085952235129960809599898180311840、B:0.45959536930024790930245539965226079881547710295342223860381081920 T:0.09539546930852567198933768141898732254664847334297019797573259680

random()関数の10億針の結果を以下に示します。

ネクタイ:94258105、銀行家:458337837、プレイヤー:447404058
タイ:0.094258105、
銀行家:0.458337837、
プレーヤー:0.447404058

ここでは、重要なクラスです:

import java.util.Vector; 
import java.math.BigDecimal; 
import java.math.RoundingMode; 

import org.apache.commons.math3.util.CombinatoricsUtils; 

public class BaccaratGame 
{ 

    private Vector<Integer> player = new Vector<Integer>(0); 
    private Vector<Integer> banker = new Vector<Integer>(0); 
    private int playerTotal; 
    private int bankerTotal; 
    private BaccaratShoe shoe; 
    private int playerWin = 0; 
    private int bankerWin = 0; 
    private int tie = 0; 

    private BigDecimal playerProb = new BigDecimal(0); 
    private BigDecimal bankerProb = new BigDecimal(0); 
    private BigDecimal tieProb = new BigDecimal(0); 

    public BaccaratGame(BaccaratShoe shoe) 
    { 
     this.shoe = shoe; 
     this.bankerWin=0; 
     this.playerWin=0; 
     this.tie=0; 
    } 
    //Player chooses bets 
    //action happens 

    //two cards delt 
    private int getBankerTotal() 
    { 
     bankerTotal = 0; 
     for(int i = 0; i < banker.size(); i++) 
     { 
      bankerTotal += banker.get(i); 
     } 
     bankerTotal = bankerTotal % 10; 
     return bankerTotal; 
    } 

    private int getPlayerTotal() 
    { 
     playerTotal = 0; 
     for(int i = 0; i < player.size(); i++) 
     { 
      playerTotal += player.get(i); 
     } 
     playerTotal = playerTotal % 10; 
     return playerTotal; 
    } 
    public void reseed() 
    { 
     //shoe.replaceCards(player); 
     //shoe.replaceCards(banker); 
     player = new Vector<Integer>(0); 
     banker = new Vector<Integer>(0); 
     getPlayerTotal(); 
     getBankerTotal();  
    } 
    public int oneRandomHand() 
    { 
     BaccaratShoe tmp = shoe; 
     player.add(tmp.dealRandomCard().getValue()); 
     player.add(tmp.dealRandomCard().getValue()); 

     banker.add(tmp.dealRandomCard().getValue()); 
     banker.add(tmp.dealRandomCard().getValue()); 


     getBankerTotal(); 
     getPlayerTotal(); 

     if(playerTotal < 8 && bankerTotal < 8) 
     { 
      if(playerTotal < 6) 
      { 
       //player draws third card 
       BaccaratCard third = tmp.dealRandomCard(); 
       player.add(third.getValue()); 
       getPlayerTotal(); 
       //weird banker rules 
       if(third.getValue() < 4) 
       { 
        if(bankerTotal < 5) 
        { 
         //banker draws third card 
         banker.add(tmp.dealRandomCard().getValue()); 
         getBankerTotal(); 

        } 
       } 
       else if(third.getValue() < 6) 
       { 
        if(bankerTotal < 6) 
        { 
         //banker draws third card 
         banker.add(tmp.dealRandomCard().getValue()); 
         getBankerTotal(); 

        } 
       } 
       else if(third.getValue() < 8) 
       { 
        if(bankerTotal < 7) 
        { 
         //banker draws third card 
         banker.add(tmp.dealRandomCard().getValue()); 
         getBankerTotal(); 

        } 
       } 
       else if(third.getValue() == 8) 
       { 
        if(bankerTotal < 3) 
        { 
         //banker draws third card 
         banker.add(tmp.dealRandomCard().getValue()); 
         getBankerTotal(); 

        } 
       } 
       else 
       { 
        //A9T 
        if(bankerTotal < 4) 
        { 
         //banker draws third card 
         banker.add(tmp.dealRandomCard().getValue()); 
         getBankerTotal();  
        } 
       }  
      } 
      else if(bankerTotal < 6) 
      { 
       //banker draws third card 
       banker.add(tmp.dealRandomCard().getValue()); 
       getBankerTotal(); 
      } 
     } 
     return getWinner(); 

    } 

    public void recordWinner(Vector<Integer> originalRanks) 
    { 
     int winner = getWinner(); 
     BigDecimal prob = getProb(originalRanks, player, banker); 

     if(winner==-1) 
     { 
      this.bankerProb = this.bankerProb.add(prob); 
      this.bankerWin++; 
     } 
     else if(winner==1) 
     { 
      this.playerProb = this.playerProb.add(prob); 
      this.playerWin++; 
     } 
     else if(winner==0) 
     { 
      this.tieProb = this.tieProb.add(prob); 
      this.tie++; 
     } 
     String playerHand = "p: "; 
     for(int i=0; i < player.size(); i++) 
     { 
      playerHand += player.get(i).toString() + " "; 
     } 
     String bankerHand = "b: "; 
     for(int i=0; i < banker.size(); i++) 
     { 
      bankerHand += banker.get(i).toString() + " "; 
     } 
     System.out.println("HAND " + playerHand + bankerHand); 
     System.out.println("SCORE p:" + String.valueOf(this.playerWin) + ", b:" + String.valueOf(this.bankerWin) + " t:" + String.valueOf(this.tie)); 
     System.out.println("Prob p:" + this.playerProb.toString() + ", b:" + this.bankerProb.toString() + " t:" + this.tieProb.toString()); 
     System.out.println("current prob=" + prob.toString()); 

    } 
    public int getWinner() 
    { 
     getBankerTotal(); 
     getPlayerTotal(); 
     if(bankerTotal == playerTotal) 
     { 
      return 0; // tie 
     } 
     else if(bankerTotal > playerTotal) 
     { 
      return -1; // banker wins 
     } 
     else 
     { 
      return 1; // player wins 
     } 

    } 
    public boolean dragon7Winner() 
    { 
     if(banker.size() != 3) 
     { 
      return false; 
     } 
     if(getBankerTotal() != 7) 
     { 
      return false; 
     } 
     if(getWinner() != -1) 
     { 
      return false; 
     } 
     return true;  
    } 
    public boolean panda8Winner() 
    { 
     if(player.size() != 3) 
     { 
      return false; 
     } 
     if(getPlayerTotal() != 8) 
     { 
      return false; 
     } 
     if(getWinner() != 1) 
     { 
      return false; 
     } 
     return true;  
    } 
    public BigDecimal getProb(Vector<Integer> ranks, Vector<Integer> player, Vector<Integer> banker) 
    { 
     //count of the ranks before the hands are dealt 

     //check for pairs 

     //get a total of ranks 
     int totalCards = 0; 
     for(int i=0; i < ranks.size(); i++) 
     { 
      totalCards += ranks.get(i); 
     } 
     String rankStr = ""; 
     for (int i = 0; i < 10; i++) 
     { 
      rankStr+= i + "[" + ranks.get(i) + "] "; 
     } 
     System.out.println(rankStr); 
     int card1Count = ranks.get(player.get(0)); 
     int card2Count = ranks.get(player.get(1)); 

     BigDecimal current = getHandPercentge(card1Count, card2Count, totalCards, 2); 
     //System.out.println("c1:" + current.toString()); 
     if(player.get(0) == player.get(1)) 
     { 
      current = getHandPercentge(card1Count, card2Count - 1, totalCards, 2).divide(new BigDecimal(2)); 
     } 
     else 
     { 
      current = getHandPercentge(card1Count, card2Count, totalCards, 2); 
     } 
     totalCards = totalCards - 2;getClass(); 

     if(player.size() > 2) 
     { 
      int card3Count = ranks.get(player.get(2)); 
      if(player.get(2) == player.get(1)) 
      { 
       card3Count = card3Count - 1; 
      } 
      if(player.get(2) == player.get(0)) 
      { 
       card3Count = card3Count - 1; 
      } 
      current = current.multiply(new BigDecimal(card3Count).divide(new BigDecimal(totalCards), 16, RoundingMode.HALF_UP)); 
     } 
     totalCards = totalCards - 1; 

     card1Count = ranks.get(banker.get(0)); 
     card2Count = ranks.get(banker.get(1)); 

     for(int i = 0; i < player.size(); i++) 
     { 
      if(player.get(i) == banker.get(0)) 
      { 
       card1Count = card1Count - 1; 
      } 
      if(player.get(i) == banker.get(1)) 
      { 
       card2Count = card2Count - 1; 
      } 
     } 
     if(banker.get(0) == banker.get(1)) 
     { 
      current = current.multiply(getHandPercentge(card1Count, card2Count - 1, totalCards, 2).divide(new BigDecimal(2))); 
     } 
     else 
     { 
      current = current.multiply(getHandPercentge(card1Count, card2Count, totalCards, 2)); 
     } 

     totalCards = totalCards - 2; 
     if(banker.size() > 2) 
     { 
      int card3Count = ranks.get(banker.get(2)); 
      if(banker.get(2) == player.get(1)) 
      { 
       card3Count = card3Count - 1; 
      } 
      if(banker.get(2) == player.get(0)) 
      { 
       card3Count = card3Count - 1; 
      } 
      if(player.size() > 2) 
      { 
       if(banker.get(2) == player.get(2)) 
       { 
        card3Count = card3Count - 1; 
       } 
      } 
      if(banker.get(2) == banker.get(1)) 
      { 
       card3Count = card3Count - 1; 
      } 
      if(banker.get(2) == banker.get(0)) 
      { 
       card3Count = card3Count - 1; 
      } 
      //System.out.println("card3Count=" + card3Count); 
      current = current.multiply(new BigDecimal(card3Count).divide(new BigDecimal(totalCards), 16, RoundingMode.HALF_UP)); 

     } 
     //System.out.println("last:" + current.toString()); 
     return current; 
    } 
    public static BigDecimal getHandPercentge(int card1Count, int card2Count, int totalCards, int numberToDraw) 
    { 
     return new BigDecimal(card1Count).multiply(new BigDecimal(card2Count).divide(new BigDecimal(CombinatoricsUtils.binomialCoefficient(totalCards, numberToDraw)), 16 ,RoundingMode.HALF_UP)); 
    } 
    public void enumBaccarat() 
    { 
     Vector<Integer> ranks = new Vector<Integer>(10); 
     for (int i = 0; i < 10; i++) 
     { 
      ranks.add(i, 0); 
     } 
     for (int i = 0; i < shoe.getSize(); i++) 
     { 
      int index = shoe.getCard(i).getValue(); 
      int current = ranks.get(index); 
      ranks.set(index, current + 1); 
     } 
     Vector<Integer> originalRanks = new Vector<Integer>(0); 
     originalRanks.addAll(ranks); 
     String rankStr = ""; 
     for (int i = 0; i < 10; i++) 
     { 
      rankStr+= i + "[" + ranks.get(i) + "] "; 
     } 
     System.out.println(rankStr); 
     for (int one = 0; one < 10; one++) 
     { 
      Vector<Integer> tmpRanks = ranks; 
      int current = tmpRanks.get(one); 
      if(current <= 0) 
      { 
       continue; 
      } 
      player.add(0, one); 
      tmpRanks.set(one, current - 1); 
      //deal first 4 cards 
      //check if more should be dealt 
      for (int two = 0; two < 10; two++) 
      { 

       current = tmpRanks.get(two); 
       if(current <= 0) 
       { 
        continue;//skip cards we've run out of 
       } 
       banker.add(0, two); 
       tmpRanks.set(two, current - 1); 
       for (int three = 0; three <= one; three++) 
       { 

        current = tmpRanks.get(three); 
        if(current <= 0) 
        { 
         continue; 
        } 
        player.add(1, three); 
        tmpRanks.set(three, current - 1); 
        for (int four = 0; four <= two; four++) 
        { 


         current = tmpRanks.get(four); 
         if(current <= 0) 
         { 
          continue; 
         } 
         banker.add(1, four); 
         tmpRanks.set(four, current - 1); 

         if(getPlayerTotal() < 8 && getBankerTotal() < 8) 
         { 
          if(getPlayerTotal() < 6) 
          { 
           //player draws 3rd card 
           for(int five = 0; five < 10; five++) 
           { 
            current = tmpRanks.get(five); 
            if(current <= 0) 
            { 
             continue; 
            } 
            player.add(2, five); 
            tmpRanks.set(five, current - 1); 
            int tmpBT = getBankerTotal(); 
            if(tmpBT == 7) 
            { 
             recordWinner(originalRanks); 

             rankStr = ""; 
             for (int i = 0; i < 10; i++) 
             { 
              rankStr+= i + "[" + ranks.get(i) + "] "; 
             } 
             System.out.println(rankStr); 
            } 
            else if(tmpBT < 3) 
            { 
             for(int six = 0; six < 10; six++) 
             { 
              current = tmpRanks.get(six); 
              if(current <= 0) 
              { 
               continue; 
              } 
              banker.add(2, six); 
              recordWinner(originalRanks); 

              rankStr = ""; 
              for (int i = 0; i < 10; i++) 
              { 
               rankStr+= i + "[" + ranks.get(i) + "] "; 
              } 
              System.out.println(rankStr); 
              banker.remove(2); 
             } 
            } 
            else if(tmpBT == 6) 
            { 
             if(five==6 || five==7) 
             { 
              for(int six = 0; six < 10; six++) 
              { 
               current = tmpRanks.get(six); 
               if(current <= 0) 
               { 
                continue; 
               } 
               banker.add(2, six); 
               recordWinner(originalRanks); 

               rankStr = ""; 
               for (int i = 0; i < 10; i++) 
               { 
                rankStr+= i + "[" + ranks.get(i) + "] "; 
               } 
               System.out.println(rankStr); 
               banker.remove(2); 
              } 
             } 
             else 
             { 
              recordWinner(originalRanks); 

              rankStr = ""; 
              for (int i = 0; i < 10; i++) 
              { 
               rankStr+= i + "[" + ranks.get(i) + "] "; 
              } 
              System.out.println(rankStr); 
             } 
            } 
            else if(tmpBT == 5) 
            { 
             if(five > 3 && five < 8)  
             { 
              for(int six = 0; six < 10; six++) 
              { 
               current = tmpRanks.get(six); 
               if(current <= 0) 
               { 
                continue; 
               } 
               banker.add(2, six); 
               recordWinner(originalRanks); 

               rankStr = ""; 
               for (int i = 0; i < 10; i++) 
               { 
                rankStr+= i + "[" + ranks.get(i) + "] "; 
               } 
               System.out.println(rankStr); 
               banker.remove(2); 
              } 
             } 
             else 
             { 
              recordWinner(originalRanks); 

              rankStr = ""; 
              for (int i = 0; i < 10; i++) 
              { 
               rankStr+= i + "[" + ranks.get(i) + "] "; 
              } 
              System.out.println(rankStr); 
             } 
            } 
            else if(tmpBT == 4) 
            { 
             if(five > 1 && five < 8)  
             { 
              for(int six = 0; six < 10; six++) 
              { 
               current = tmpRanks.get(six); 
               if(current <= 0) 
               { 
                continue; 
               } 
               banker.add(2, six); 
               recordWinner(originalRanks); 

               rankStr = ""; 
               for (int i = 0; i < 10; i++) 
               { 
                rankStr+= i + "[" + ranks.get(i) + "] "; 
               } 
               System.out.println(rankStr); 
               banker.remove(2); 
              } 
             } 
             else 
             { 
              recordWinner(originalRanks); 

              rankStr = ""; 
              for (int i = 0; i < 10; i++) 
              { 
               rankStr+= i + "[" + ranks.get(i) + "] "; 
              } 
              System.out.println(rankStr); 
             } 
            } 
            else if(tmpBT == 3) 
            { 
             if(five != 8) 
             { 
              for(int six = 0; six < 10; six++) 
              { 
               current = tmpRanks.get(six); 
               if(current <= 0) 
               { 
                continue; 
               } 
               banker.add(2, six); 
               recordWinner(originalRanks); 

               rankStr = ""; 
               for (int i = 0; i < 10; i++) 
               { 
                rankStr+= i + "[" + ranks.get(i) + "] "; 
               } 
               System.out.println(rankStr); 
               banker.remove(2); 
              } 
             } 
             else 
             { 
              recordWinner(originalRanks); 

              rankStr = ""; 
              for (int i = 0; i < 10; i++) 
              { 
               rankStr+= i + "[" + ranks.get(i) + "] "; 
              } 
              System.out.println(rankStr); 
             } 
            } 
            player.remove(2); 
            tmpRanks.set(five, tmpRanks.get(five) + 1); 
           } 

          } 
          else if(getBankerTotal() < 6) 
          { 
           for(int five = 0; five < 10; five++) 
           { 
            current = tmpRanks.get(five); 
            if(current <= 0) 
            { 
             continue; 
            } 
            banker.add(2, five); 
            recordWinner(originalRanks); 

            rankStr = ""; 
            for (int i = 0; i < 10; i++) 
            { 
             rankStr+= i + "[" + ranks.get(i) + "] "; 
            } 
            System.out.println(rankStr); 
            banker.remove(2); 
           } 
          } 
          else 
          { 
           recordWinner(originalRanks); 

           rankStr = ""; 
           for (int i = 0; i < 10; i++) 
           { 
            rankStr+= i + "[" + ranks.get(i) + "] "; 
           } 
           System.out.println(rankStr); 
          } 
         } 
         else 
         { 
          recordWinner(originalRanks); 

          rankStr = ""; 
          for (int i = 0; i < 10; i++) 
          { 
           rankStr+= i + "[" + ranks.get(i) + "] "; 
          } 
          System.out.println(rankStr); 
         } 

         banker.remove(1); 
         tmpRanks.set(four, tmpRanks.get(four) + 1); 
        } 
        player.remove(1); 
        tmpRanks.set(three, tmpRanks.get(three) + 1); 
       } 
       banker.remove(0); 
       tmpRanks.set(two, tmpRanks.get(two) + 1); 
      } 
      player.remove(0); 
      tmpRanks.set(one, tmpRanks.get(one) + 1); 
     } 
    } 

答えて

0

はのは、別のものを考えてみましょうたとえば、1つの公正なダイのロール。理論的には、確率は以下のとおりです。

  1. 1/6
  2. 1/6
  3. 1/6
  4. 1/6
  5. 1/6
  6. 1/6

しかし、あなたがシミュレーションを行った場合、おそらく確率は1/6と少し異なる可能性があります。

バカラのシミュレーション結果が理論的な結果と少し違って見えても、それほど驚くべきことではありません。

しかし、この特定の例では、あなたのコードは、あなたが比較しようとしている奇妙な結果の結果とは異なっているようです。 third.getValue() < 4の場合。ルールとデッキの数など、すべての詳細を比較しようとしているものとシミュレーションが一致していることを確認してください。デッキからいくつかのカードが処理されると、次のカードが特定の価値を持つ確率は、異なる価値のカードがすでに処理されていた場合とは少し異なります。

+0

機能の1つでは、すべての可能な組み合わせをテストします。私はシミュレーションと列挙の両方を行い、両方とも公開された結果に同意しませんでした。機能の1つでは、可能なすべての組み合わせをテストします – stodosisis

+0

あなたは、あなたが比較しているオッズの数字の数字とまったく同じルールを守っていますか?あなたは同じ中間結果を得ますか? – WBT

+0

私ができることを確かにして、私は論理をチェックして、私には違いが見つかるかどうかを確認しました。私は中間結果が意味することを理解していません。 – stodosisis

関連する問題