See the top rated post in this thread. Click here

Page 8 of 13 FirstFirst ... 678910 ... LastLast
Results 92 to 104 of 158

Thread: Proving CA algorithms incorrect (or at least inexact)

  1. #92


    Did you find this post helpful? Yes | No
    Quote Originally Posted by iCountNTrack View Post
    Hi Cac, you are exactly right for SPL1 and SPL2 the CA returns the same value because splitting is not optimal. My algorithm would take that walk of re-splitting compute the EV compare it to other playing decisions and disregard it. As far as your other ask, unfortunately I cannot compute overall EVs, while it's faster than Eric's python implementation, it's still really slow and can only compute specific player hand against a dealer upcard.
    Hi ICNT,

    There's a small difference I still can't reconcile. For 8,8 vs. 8, my EV is slightly lower than yours and the maximum calculated by Eric. Your EV is 1.009777407946744, while mine is 1.0093134195637896. I'll keep looking to figure out where this difference might come from.

    Sincerely,
    Cac
    Luck is what happens when preparation meets opportunity.

  2. #93


    Did you find this post helpful? Yes | No
    Quote Originally Posted by ericfarmer View Post
    Yeah, I tried to make the gist reasonably machine-readable, the idea being to automate evaluation of each of those split EVs-- with an eye toward comparison with the E[X_max] value in each case, searching for similar exceedances like I did in finding this particular one with E[X_CDP]. Let me know if a different format is easier to work with, or if I can otherwise help.
    Maybe a more convenient import format would be a space-separated text file, and instead of fractions, I’d prefer decimal numbers. For example:
    0 0 0 0 0 14 0 13 0 0 8 8 1.0108481503689 1.0097774079467

    I should maybe clarify what's easy and what's hard here. The E[X_max] values, i.e. the truly maximum EV among all possible strategies, computed using either my recent Python code or iCountNTrack's recent fixes to his code, indeed take a long time to evaluate. But CDP, on the other hand, is just as fast as CDP1, CDZ-, mimic-the-dealer, etc., so that I can evaluate the entire CDP strategy and overall expected return for an arbitrary shoe in a fraction of a second, whether for multiple decks, SPL3, etc.

    Agree that for most players here, the details of this "theoretical" discussion are likely of little interest. But I do think there are practical motivations here: for example, several years ago Gronbog did some really interesting analysis of multi-parameter counting systems: imagine a spectrum of possible win rates, ranging from conventional hi-lo or HO2-ish single-parameter systems at the lower end, and the "bring-a-laptop-to-the-table maximum EV" speed of light at the upper end-- where do those multi-parameter systems live in between?

    If that analysis had been done by evaluating the upper bound performance using CDP for each round's depleted-shoe, instead of CDZ- (as it actually was, albeit for other reasons), we now know that the "speed of light" performance upper bound could have looked more distant, and incorrectly so, so that perhaps the takeaway from that analysis might have been different, with possibly less accurate or downright incorrect conclusions.

    Certainly, there are numerous practical motivations behind this theoretical discussion, and we are in full agreement on that. The objective, of course, is to identify the optimal solution and achieve it within a reasonable timeframe.

    Sincerely,
    Cac
    Luck is what happens when preparation meets opportunity.

  3. #94


    Did you find this post helpful? Yes | No
    Quote Originally Posted by Cacarulo View Post
    Hi ICNT,

    There's a small difference I still can't reconcile. For 8,8 vs. 8, my EV is slightly lower than yours and the maximum calculated by Eric. Your EV is 1.009777407946744, while mine is 1.0093134195637896. I'll keep looking to figure out where this difference might come from.

    Sincerely,
    Cac
    Optimal strategy (after splitting 8-8) is to almost always stand on 14, except double down in the following few situations (and note even some of these are not reachable via optimal strategy):

    Code:
    double on 86 vs dealer 8:
        868  88   86#  8    
        868  868  88   86#  
        868  88   88   86#  
        88   88   868  86#  
        88   868  86#  8    
        88   868  88   86#  
        868  88   868  86#  
        88   868  868  86#  
        88   88   88   86#  
        88   88   86#  8
    Maybe one of these are the difference?

  4. #95


    Did you find this post helpful? Yes | No
    Quote Originally Posted by Cacarulo View Post
    Maybe a more convenient import format would be a space-separated text file, and instead of fractions, I’d prefer decimal numbers. For example:
    0 0 0 0 0 14 0 13 0 0 8 8 1.0108481503689 1.0097774079467
    I've put this format here.

  5. #96


    1 out of 1 members found this post helpful. Did you find this post helpful? Yes | No
    Quote Originally Posted by iCountNTrack View Post
    The following is the link to my old CDCA that I built in 2011, this is the console version. I unfortunately cannot find the source for the UI. But this will do. This has the bug fix where playing decisions return the same EV discovered earlier. Please dont ask me for the source code. It's really embarrassing, it would be the perfect example of spaghetti code. To my defense it was the first full blown full coding experience for me but I am sure that the code works well. This is the CA that uses my "locally optimum" algorithm and ZERO recursion.

    https://drive.google.com/file/d/13Ey...ew?usp=sharing
    Thanks for this, stdin/out makes automation a lot easier. I ran this through the gist of small (shoe, split hand) scenarios, and compared each output with the corresponding E[X_max] values. The following figure shows a scatter plot of results, organized (on the x-axis) by the total number of cards in the depleted shoe:

    cdca_comparison.jpg

    Quote Originally Posted by iCountNTrack View Post
    The following is the source for my totally new implementation using brute force. I do use a memoization map to avoid re-calculating outcomes for the same split hands. The code uses recursion but it's really simple. It matches my older CA results and Eric's python code for almost everything except a couple of deck compositions and plays where it's yielding higher values. I cant seem to figure out whether it's a bug or real.
    What compiler (version) are you using? I'm getting compiler errors with both MSVS and g++ (w64devkit).

    Thanks,
    E

  6. #97


    Did you find this post helpful? Yes | No
    Quote Originally Posted by ericfarmer View Post
    Thanks for this, stdin/out makes automation a lot easier. I ran this through the gist of small (shoe, split hand) scenarios, and compared each output with the corresponding E[X_max] values. The following figure shows a scatter plot of results, organized (on the x-axis) by the total number of cards in the depleted shoe:

    cdca_comparison.jpg

    E
    Nice work! Did you use Igor Pro to plot this? Do you have the results in a table including the deck composition used? I had hoped our results would be less scattered

    Quote Originally Posted by ericfarmer View Post
    Thanks for this, stdin/out makes automation a lot easier. I ran this through the gist of small (shoe, split hand) scenarios, and compared each output with the corresponding E[X_max] values. The following figure shows a scatter plot of results, organized (on the x-axis) by the total number of cards in the depleted shoe:


    E
    I am using VS 2022. I suspect you are using the default C++14 standard, you will need to use the C++17 or C++20 (I am using C++20 standard)
    Last edited by iCountNTrack; 12-02-2024 at 05:47 PM.
    Chance favors the prepared mind

  7. #98


    Did you find this post helpful? Yes | No
    Quote Originally Posted by Cacarulo View Post
    Hi ICNT,

    There's a small difference I still can't reconcile. For 8,8 vs. 8, my EV is slightly lower than yours and the maximum calculated by Eric. Your EV is 1.009777407946744, while mine is 1.0093134195637896. I'll keep looking to figure out where this difference might come from.

    Sincerely,
    Cac
    Hi Cac, please see below for the final states for all the combinations of split hands (last column indicates the multiplicity) used in the EV calculation. You can see that there are certain doubled hands which are impacting the results in your code.

    Code:
    Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0)	1
    Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0)  	3
    Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0)	10
    Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0)	10
    Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0)	10
    Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0)	10
    Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0)	7
    Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0)	7
    Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0)	7
    Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0)	7
    Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0)	4
    Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0)	4
    Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0)	4
    Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0)	4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6,6 (dblChk: 1) || Hand:8,6 (dblChk: 0)	4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6,6 (dblChk: 1) || Hand:8,8 (dblChk: 0)	4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6,8 (dblChk: 1) || Hand:8,6,6 (dblChk: 1)	4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6,8 (dblChk: 1) || Hand:8,6,8 (dblChk: 1)	4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6,8 (dblChk: 1) || Hand:8,8 (dblChk: 0)	4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6,6 (dblChk: 1)	4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6,8 (dblChk: 1)	4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0)	4
    Chance favors the prepared mind

  8. #99


    Did you find this post helpful? Yes | No
    Quote Originally Posted by ericfarmer View Post
    Optimal strategy (after splitting 8-8) is to almost always stand on 14, except double down in the following few situations (and note even some of these are not reachable via optimal strategy):
    I don’t quite understand; what does it mean that some are not reachable via optimal strategy?

    Code:
    double on 86 vs dealer 8:
        868  88   86#  8    
        868  868  88   86#  
        868  88   88   86#  
        88   88   868  86#  
        88   868  86#  8    
        88   868  88   86#  
        868  88   868  86#  
        88   868  868  86#  
        88   88   88   86#  
        88   88   86#  8
    Maybe one of these are the difference?
    I’ll review the code later to see if I can find the differences. Thanks.

    Sincerely,
    Cac
    Luck is what happens when preparation meets opportunity.

  9. #100


    Did you find this post helpful? Yes | No
    Quote Originally Posted by iCountNTrack View Post
    Hi Cac, please see below for the final states for all the combinations of split hands (last column indicates the multiplicity) used in the EV calculation. You can see that there are certain doubled hands which are impacting the results in your code.

    Code:
    Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0)    1
    Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0)      3
    Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0)    10
    Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0)    10
    Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0)    10
    Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0)    10
    Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0)    7
    Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0)    7
    Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0)    7
    Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0)    7
    Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0)    4
    Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0)    4
    Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0)    4
    Hand:8,8 (dblChk: 0) || Hand:8,6 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0)    4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6,6 (dblChk: 1) || Hand:8,6 (dblChk: 0)    4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6,6 (dblChk: 1) || Hand:8,8 (dblChk: 0)    4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6,8 (dblChk: 1) || Hand:8,6,6 (dblChk: 1)    4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6,8 (dblChk: 1) || Hand:8,6,8 (dblChk: 1)    4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6,8 (dblChk: 1) || Hand:8,8 (dblChk: 0)    4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6,6 (dblChk: 1)    4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,6,8 (dblChk: 1)    4
    Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0) || Hand:8,8 (dblChk: 0)    4
    Thanks ICNT. Later, I will review the code to see where the difference is coming from.

    Sincerely,
    Cac
    Luck is what happens when preparation meets opportunity.

  10. #101


    Did you find this post helpful? Yes | No
    Quote Originally Posted by ericfarmer View Post
    I've put this format here.
    Thank you! In a while, I will share some examples from the list that I found very interesting.

    Sincerely,
    Cac
    Luck is what happens when preparation meets opportunity.

  11. #102


    Did you find this post helpful? Yes | No
    Gentlemen, here are some interesting examples I’d like you to recalculate, especially the maximum expected value:


    1. 0 0 0 0 0 4 7 0 0 0 | 7, 7 vs 6 |
    2. 0 0 0 0 0 4 7 0 0 0 | 6, 6 vs 6 |
    3. 0 0 0 0 0 6 4 0 0 0 | 7, 7 vs 6 |
    4. 0 0 0 0 0 7 5 0 0 0 | 7, 7 vs 6 |


    For now, just these.

    Sincerely,
    Cac
    Luck is what happens when preparation meets opportunity.

  12. #103


    Did you find this post helpful? Yes | No
    Quote Originally Posted by iCountNTrack View Post
    Nice work! Did you use Igor Pro to plot this? Do you have the results in a table including the deck composition used? I had hoped our results would be less scattered
    This figure was created using Mathematica; that's what I typically reach for when doing visualization.

    The split EVs are here, in the same order as the previously linked table (in original format here, and updated for Cacarulo here).

    Quote Originally Posted by iCountNTrack View Post
    I am using VS 2022. I suspect you are using the default C++14 standard, you will need to use the C++17 or C++20 (I am using C++20 standard)
    Yeah, I couldn't get g++ to deduce the specialization of your hash<GameStateKey> without an explicit typename, even with C++20. But I did get MSVS to work; following is a log of the output for the original 6-6 vs. 8 example (starting from 11 sixes and 5 eights), where your split EV is 3.818181818181817. Compare with my value of 2.295104895104895, which agrees with your local-optimum value from the above table.

    Code:
    Composition Dependent Combinatorial Analyzer 2025
    
    Do you want to:
    1) Enter the number of decks
    2) Enter the composition of every rank for a depleted deck
    Enter your choice (1 or 2): 2
    Enter the composition of each rank (number of cards for A, 2-10, J, Q, K), separated by spaces:
    (Order: A 2 3 4 5 6 7 8 9 10/J/Q/K): 0 0 0 0 0 11 0 5 0 0
    Enter game rules:
    Does the dealer hit on soft 17? (y/n): n
    Is double after split allowed? (y/n): y
    Is resplitting allowed? (y/n): y
    Enter maximum number of resplits: 3
    Is European No Hole Card (ENHC) rule in effect? (y/n): n
    Enter dealer's upcard (A, 2-10, J, Q, K): 8
    Enter player's cards (A, 2-10, J, Q, K), separated by spaces: 6 6
    Elapsed time: 1.37719 seconds
    
    Outcome Statistics:
    
    Action: Stand
    Expectation Value: 0.0769231
    Standard Deviation: 0.997037
    Net Outcome Probabilities:
      Net Outcome: -1 units, Probability: 0.461538
      Net Outcome: 1 units, Probability: 0.538462
    
    Action: Hit
    Expectation Value: 0.244755
    Standard Deviation: 0.878785
    Net Outcome Probabilities:
      Net Outcome: -1 units, Probability: 0.293706
      Net Outcome: 0 units, Probability: 0.167832
      Net Outcome: 1 units, Probability: 0.538462
    
    Action: Double Down
    Expectation Value: 0.48951
    Standard Deviation: 1.75757
    Net Outcome Probabilities:
      Net Outcome: -2 units, Probability: 0.293706
      Net Outcome: 0 units, Probability: 0.167832
      Net Outcome: 2 units, Probability: 0.538462
    
    Action: Split
    Expectation Value: 3.818181818181817
    Standard Deviation: 3.114880308911239
    Net Outcome Probabilities:
      Net Outcome: -4.000000000000000 units, Probability: 0.001398601398601
      Net Outcome: -3.000000000000000 units, Probability: 0.004195804195804
      Net Outcome: -2.000000000000000 units, Probability: 0.020979020979021
      Net Outcome: -1.000000000000000 units, Probability: 0.020979020979021
      Net Outcome: 0.000000000000000 units, Probability: 0.034965034965035
      Net Outcome: 4.000000000000000 units, Probability: 0.086713286713287
      Net Outcome: 5.000000000000000 units, Probability: 0.005594405594406
      Net Outcome: 8.000000000000000 units, Probability: 0.440559440559440
    
    Best Action: Split

  13. #104


    Did you find this post helpful? Yes | No
    Quote Originally Posted by ericfarmer View Post
    This figure was created using Mathematica; that's what I typically reach for when doing visualization.

    The split EVs are here, in the same order as the previously linked table (in original format here, and updated for Cacarulo here).



    Yeah, I couldn't get g++ to deduce the specialization of your hash<GameStateKey> without an explicit typename, even with C++20. But I did get MSVS to work; following is a log of the output for the original 6-6 vs. 8 example (starting from 11 sixes and 5 eights), where your split EV is 3.818181818181817. Compare with my value of 2.295104895104895, which agrees with your local-optimum value from the above table.

    Code:
    Composition Dependent Combinatorial Analyzer 2025
    
    Do you want to:
    1) Enter the number of decks
    2) Enter the composition of every rank for a depleted deck
    Enter your choice (1 or 2): 2
    Enter the composition of each rank (number of cards for A, 2-10, J, Q, K), separated by spaces:
    (Order: A 2 3 4 5 6 7 8 9 10/J/Q/K): 0 0 0 0 0 11 0 5 0 0
    Enter game rules:
    Does the dealer hit on soft 17? (y/n): n
    Is double after split allowed? (y/n): y
    Is resplitting allowed? (y/n): y
    Enter maximum number of resplits: 3
    Is European No Hole Card (ENHC) rule in effect? (y/n): n
    Enter dealer's upcard (A, 2-10, J, Q, K): 8
    Enter player's cards (A, 2-10, J, Q, K), separated by spaces: 6 6
    Elapsed time: 1.37719 seconds
    
    Outcome Statistics:
    
    Action: Stand
    Expectation Value: 0.0769231
    Standard Deviation: 0.997037
    Net Outcome Probabilities:
      Net Outcome: -1 units, Probability: 0.461538
      Net Outcome: 1 units, Probability: 0.538462
    
    Action: Hit
    Expectation Value: 0.244755
    Standard Deviation: 0.878785
    Net Outcome Probabilities:
      Net Outcome: -1 units, Probability: 0.293706
      Net Outcome: 0 units, Probability: 0.167832
      Net Outcome: 1 units, Probability: 0.538462
    
    Action: Double Down
    Expectation Value: 0.48951
    Standard Deviation: 1.75757
    Net Outcome Probabilities:
      Net Outcome: -2 units, Probability: 0.293706
      Net Outcome: 0 units, Probability: 0.167832
      Net Outcome: 2 units, Probability: 0.538462
    
    Action: Split
    Expectation Value: 3.818181818181817
    Standard Deviation: 3.114880308911239
    Net Outcome Probabilities:
      Net Outcome: -4.000000000000000 units, Probability: 0.001398601398601
      Net Outcome: -3.000000000000000 units, Probability: 0.004195804195804
      Net Outcome: -2.000000000000000 units, Probability: 0.020979020979021
      Net Outcome: -1.000000000000000 units, Probability: 0.020979020979021
      Net Outcome: 0.000000000000000 units, Probability: 0.034965034965035
      Net Outcome: 4.000000000000000 units, Probability: 0.086713286713287
      Net Outcome: 5.000000000000000 units, Probability: 0.005594405594406
      Net Outcome: 8.000000000000000 units, Probability: 0.440559440559440
    
    Best Action: Split
    Aaaa, sorry I should have told you about this. The number of resplits means the number of splits AFTER the initial split. So when you input 3 that means you will end up with 5 split hands.
    Chance favors the prepared mind

Page 8 of 13 FirstFirst ... 678910 ... LastLast

Similar Threads

  1. Incorrect Strategy Errors CVBJ
    By jmeezy in forum Software
    Replies: 1
    Last Post: 04-20-2020, 11:04 AM
  2. Help on Uk casino algorithms.
    By smallville1979 in forum Software
    Replies: 2
    Last Post: 02-06-2018, 10:34 PM

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

About Blackjack: The Forum

BJTF is an advantage player site based on the principles of comity. That is, civil and considerate behavior for the mutual benefit of all involved. The goal of advantage play is the legal extraction of funds from gaming establishments by gaining a mathematic advantage and developing the skills required to use that advantage. To maximize our success, it is important to understand that we are all on the same side. Personal conflicts simply get in the way of our goals.