Pre-flop Probabilities

Considering your starting hands

Moving along the x-axis, we iterate through hole cards starting with 2-2 → 2-A → 3-2 and so on to A-A. The y-axis is the probability of winning/tying each hand at showdown against some number of players. Of course this does not take into account any strategy.

Since, for example, 2♦-K♦ has the same probability pre-flop as 2♥-K♥, 2♠-K♠, and 2♣-K♣ (and similar for unsuited cards), instead of repeating the same data four times along the x-axis we default to one card being diamonds and omit the redundant data. Data is repeated once, however, as 2♦-K♥ and K♥-2♦ share the same probability and are both on the x-axis.

Post-flop Probabilities

Considering pairs/high-cards

Example Flop (no suited, no connectors/gappers):

Curves reflect the effect of pairs/high card. Flushes/straights are minimized with wide flop with different suits and by setting hold-cards to only be suited on diamonds which aren't on the flop.

You can pretty much extrapolate the odds for every pair/3-of-a-kind from within line of best fit created between the 3, 8, and K.

The shape of the curve doesn't really change with more or less players, it just flattens with the average return staying about where the 50% mark is in the two-player graph. So we'll just use 2-player graphs now since they're essentially a stretched up version that's easier to read.

Considering straights

Example Flop (no suited, one connector):

Example Flop (no suited, twos connector):

Example Flop (no suited, one gapper):

Example Flop (no suited, two gapper):

Hands that add to the straight aren't as impressive as I would have thought. A 9 and 10 are positive on their return, but only perform about as well as a pair of 6s. A 6 and 9 and 5 and 6 are still negative in return.

The big hump is the middle is mostly from pairs/3-of-a-kind with the 7s, 8s, or 9s, but yeah if your pocket cards complete the straight obviously you have good chances even when it's a low straight. If your pocket cards don't complete it, your returns are in the negative here even if you have one connector but nothing else.

Still the dominant good hands are all pairs/3-of-a-kind. Even having the 7 and 5 or 9 to make an open-ended straight only hovers around the 0 return mark and is negative with the 5. A pair of 7s that fill the gap only perform about 1% better than a pair of 7s that don't.

More of the same. Even if you have a 6 and a 7 to make an open ended straight, your return is still in the negatives.

Considering flushes

Example Flop (no suited, no connectors/gappers):

Example Flop (one suited, no connectors/gappers):

Example Flop (two suited, no connectors/gappers):

Example Flop (three suited, no connectors/gappers):

Suited hole cards perform no better than unsuited cards when there are no matching suits on the flop.

One suited card on the flop makes little difference even if you have suited hole cards. 4% chance of getting a flush.

When there are two suited cards on the flop that match suited hole cards, your chance of getting a flush is 35%. Average return is only >0 when they sum over 12 (eg. 2/T, 3/9).

If you have pocket diamonds you always have a >0 here. Outside of that, other players will likely also have flushes at showdown but if you've got at least one diamond 10 or greater, you pretty much always have a return of >0.

Data

I was able to collect this data for these graphs by using williamhoza.com's Texas Hold'em Probability Calculator JavaScript app, which iterates many simulations on a given input for the hole and community cards to determine the probability of different outcomes. It's a really handy little application and much credit there. I downloaded it and ran it locally so that I wasn't constantly refreshing his page and only made trivial modifications on my side.

The only thing tricky about it was that for some reason the Ace of Diamonds image would never show, and I spent 30 minutes or so trying to understand why until I realized that it was being blocked by my adblocker because the file is called "ad.png".

To run through every combinaton of cards and capture the results in a table, I inserted the following JavaScript:

var hands_ = [];
var suits_ = ["c", "s", "h", "d"];
var ranks_ = ["2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A"];
var cards_ = [];

ranks_.forEach((e) => {
    suits_.forEach((e2) => {
        //if (e + e2 != "7s" && e + e2 != "8c" && e + e2 != "Kh") for when to exclude cards that are already in the community cards
            cards_.push(e + e2);
    });
});

cards_.forEach((e) => {
    cards_.forEach((e2) => {
        if (e != e2 && e[1] == "d") // defaulting to only diamonds for the first card
            hands_.push(e + e2);
    });
});

function card1(rank_, suit_) {
    document.querySelector("#playersContainer > div:nth-child(1) > table > tbody > tr > td:nth-child(1) > div.linkBox > a:nth-child(1)").click();
    body_keydown({
        keyCode: rank_.toUpperCase().charCodeAt(0)
    });
    body_keydown({
        keyCode: suit_.toUpperCase().charCodeAt(0)
    });
}

function card2(rank_, suit_) {
    document.querySelector("#playersContainer > div:nth-child(1) > table > tbody > tr > td:nth-child(2) > div.linkBox > a:nth-child(1)").click();
    body_keydown({
        keyCode: rank_.toUpperCase().charCodeAt(0)
    });
    body_keydown({
        keyCode: suit_.toUpperCase().charCodeAt(0)
    });
}

var c0, c1, c2, c3;
var i = 0;

console.log("Card,Win,Tie,Lose,Return");

function myLoop() {
    setTimeout(function() {
        e = hands_[i];
        var ret_ = document.querySelector("#chancesDiv > span:nth-child(1)").innerText;
        var win_ = document.querySelector("#chancesDiv > span:nth-child(3)").innerText;
        var los_ = document.querySelector("#chancesDiv > span:nth-child(5)").innerText;
        var tie_ = document.querySelector("#chancesDiv > span:nth-child(7)").innerText;

        console.log(c0 + c1 + c2 + c3 + "," + win_ + "," + tie_ + "," + los_ + "," + ret_);

        c0 = e[0];
        c1 = e[1];
        c2 = e[2];
        c3 = e[3];
        card1(c0, c1);
        card2(c2, c3);

        i++;

        if (i < hands_.length) myLoop();

    }, 6000)
}


myLoop();