To blue or not to blue?

To continue the analysis, I would love to go into detail on the math[1] but it would be boring.

We are now computing the rational choice, i.e., the choice that saves the most people in expectation, depending on how we think others will vote. This is represented by a probability p of voting blue. We saw previously that if we assume p = 0.5, then blue is always the rational choice. Now we want to know the result for different values of p.

The result is that for any p < 0.5, with a small number of participants, blue is (sometimes when p is high enough) the rational choice. However, at some point, with enough participants, the chances of you being the deciding vote (i.e., basically being able to save them) become too low, and red becomes the rational choice. When p \geq 0.5, blue is always the rational choice.

I made a graph, although it was better in my head. (I cut off less than 10% and more than 90% because you can probably guess the color in those areas).

I wanted to upload the file but it does not allow .py so I’ll just add it here.

the (python) code
#!/usr/bin/env python3

# mostly AI generated
# you'll need to "pip install numpy matplotlib scipy"
"""
Generate a cool 2D heatmap showing where X*p_exact > p_less for 2X coin tosses.

- X-axis: number of participants
- Y-axis: p (probability of blue)
- Color:
    - Blue if X * P(exactly X blue | p) > P(less than X blue | p)
    - Red  if X * P(exactly X blue | p) < P(less than X blue | p)
"""

import math
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from scipy.stats import binom
from typing import Tuple, Optional


def calculate_probabilities(p: float, X: int) -> Tuple[float, float]:
    """
    Compute P(exactly X blue) and P(less than X blue) for 2X tosses.

    Args:
        p: Probability of blue (0 <= p <= 1)
        X: Non-negative integer; total tosses = 2X

    Returns:
        (p_exact, p_less): Probabilities of exactly X blue and less than X blue
    """
    if not (0.0 <= p <= 1.0):
        raise ValueError("p must be between 0 and 1 inclusive.")
    if X < 0:
        raise ValueError("X must be a non-negative integer.")
    
    n = 2 * X
    # P(exactly X blue)
    p_exact = binom.pmf(X, n, p)
    # P(less than X blue)
    if X > 0:
        p_less = binom.cdf(X - 1, n, p)
    else:
        # X == 0: zero tosses, zero blue; less than 0 impossible
        p_less = 0.0
    return p_exact, p_less

def is_blue_rational(p: float, X: int) -> bool:
    """
    Return True if X * P(exactly X blue | p) >= P(less than X blue | p)
    (this corresponds to BLUE having higher expected value).
    """
    p_exact, p_less = calculate_probabilities(p, X)
    left = X * p_exact
    right = p_less
    return left >= right

def find_x_threshold(p: float, max_search: int = 10**6, verbose: bool = False) -> Optional[int]:
    """
    Find the smallest integer X >= 0 such that:
        X * P(exactly X blue in 2X tosses | p) < P(less than X blue in 2X tosses | p)
        i.e. such that red becomes better (assuming probability of blue is less than 0.5)

    Args:
        p: Probability of blue (0 <= p <= 1)
        max_search: Maximum X to search (to avoid infinite loops; increase if needed)
        verbose: If True, prints progress for large searches

    Returns:
        The smallest X satisfying the inequality, or None if no such X exists
        (notably when p == 0.5, the inequality is never satisfied).
    """
    if not (0.0 <= p <= 1.0):
        raise ValueError("p must be between 0 and 1 inclusive.")
    
    # Special case: p == 0.5 -> inequality never holds
    if p >= 0.5:
        return None
    
    # Search upward from X = 0
    for X in range(0, max_search + 1):
        p_exact, p_less = calculate_probabilities(p, X)
        left = X * p_exact
        right = p_less
        if verbose and X % 10_000 == 0 and X > 0:
            print(f"Searching X = {X:,} ... left={left:.6e}, right={right:.6e}")
        if left < right:
            return X
    
    # If not found within max_search
    return None


def make_plot():
    # --- Configuration: choose ranges to make a nice plot ---
    # X ranges (half the tosses). Keep reasonable so it’s fast but informative.
    X_min = 1
    X_max = 1500        # increase to 80–120 for a sharper boundary (slower)
    X_step = 10       # grid resolution in X

    # p ranges
    p_min = 0.1
    p_max = 0.9
    p_step = 0.001     # grid resolution in p (0.005 is smoother but slower)

    # Build grids
    X_vals = np.arange(X_min, X_max + 1, X_step)
    p_vals = np.arange(p_min, p_max + 0.0000001, p_step)
    
    # Create a 2D array: rows -> p, columns -> X
    heatmap = np.zeros((len(p_vals), len(X_vals)), dtype=np.uint8)
    
    # Fill the grid: 1 = BLUE (inequality holds: X*p_exact > p_less), 0 = RED otherwise
    for i, p in enumerate(p_vals):
        for j, X in enumerate(X_vals):
            if is_blue_rational(p, X):
                heatmap[i, j] = 1  # blue
            else:
                heatmap[i, j] = 0  # red
    
    # --- Plotting ---
    # Define a clean blue/red colormap
    cmap = ListedColormap(["#d73027", "#4575b4"])  # red, blue
    # (index 0 -> red, index 1 -> blue)

    fig, ax = plt.subplots(figsize=(10, 6), dpi=120)

    # Show heatmap: note: imshow expects (rows, cols) = (y, x)
    im = ax.imshow(
        heatmap,
        cmap=cmap,
        origin="lower",
        aspect="auto",
        extent=[X_min - 0.5 * X_step, X_max + 0.5 * X_step, p_min, p_max],
        interpolation="nearest"
    )

    # Axis labels and title
    ax.set_xlabel("number of participants", fontsize=12)
    ax.set_ylabel("probability of blue vote", fontsize=12)

    # Ticks
    # Choose reasonable tick spacing for X
    x_tick_step = max(1, (X_max - X_min) // 20)
    x_ticks = np.arange(X_min, X_max + 1, x_tick_step)
    ax.set_xticks(x_ticks)
    # Replace labels with 2X+1
    ax.set_xticklabels([str(2 * x + 1) for x in x_ticks])

    # p ticks
    p_tick_step = 0.05
    ax.set_yticks(np.arange(p_min, p_max + 1e-12, p_tick_step))

    # Add a simple legend (colorbar-like legend)
    # Create proxy artists
    from matplotlib.patches import Patch
    legend_elements = [
        Patch(facecolor="#4575b4", edgecolor="black", label="Blue wins"),
        Patch(facecolor="#d73027", edgecolor="black", label="Red wins"),
    ]
    ax.legend(handles=legend_elements, loc="upper right", frameon=True)

    # Optional: add a faint grid to help read values
    ax.grid(True, which="both", linestyle=":", linewidth=0.5, alpha=0.4)

    plt.tight_layout()
    # Save or show
    # plt.savefig("inequality_heatmap.png", bbox_inches="tight")
    plt.show()

def main():
    make_plot()

if __name__ == "__main__":
    main()

  1. this is sarcastic ↩︎

Like you’d kill yourself if you had to live among such heathens. So ridiculous.

I know, right?

Like of course no actually cares if anyone else lives or dies. That’s just the way the world is. People should grow a pair and deal.

In fact living only among people who admitted they care fuck-all about anyone else—not just about whether they were happy or whatever but whether they even existed—that would frankly be a refreshing change.

How is pushing the blue button saving everyone else?

You don’t know what anyone else will actually do. So you don’t know the significance of your own vote when you push the button. All you know is you are risking yourself. That’s all you can know that you are actually doing.

Just because you want something to happen doesn’t mean you can intend it into existence through any action, or that it will actually happen through your action.

Doing good is something you do. Morality is about actions for society. How are you doing any good pushing the blue button? You are rolling dice. Period. You won’t know what you did until you learn what everyone else did.

I don’t see it.


How about this for all you wishful, hopeful, sacrificial lovers of your fellow man.

Just in case only 49% of the world pushes the blue button, I better push the red button, because the world is going to need people to help shoulder all the mourners and devastated families and support all those who lost friends and loved ones. I will make sure I live to help rebuild the world from the ashes of this button catastrophe.

How about that? Why isn’t that guy a hero?

Many of you seem so satisfied with yourselves for pushing only the blue button. Seems silly to me.

Oh the drama! I shant live in a world devoid of those who lack trust in the cooperative nature of others, who doubt in the safety of strangers, so I leave this cruel world voluntarily! It leaves nothing of value anyway!

The question is just a simple question of what you expect the outcome of a random event will be. I think folks will choose red, so I choose red. You expect blue, so you choose blue.

And this translates somehow into defining moralities where we’d rather die than deal with each other.

You can always go back and change your vote, if you now find it too embarrassing. :face_with_diagonal_mouth:

If everyone were constrained to press the button they think will save themself, there would still be people who pressed blue, i.e., who made the wrong choice, for whatever reason.

Now, in the unconstrained choice presented, it is reasonable to assume that the number of people pressing blue will be at least as large as in the constrained case.

Since the only way to save those people is to push blue over 50%, the choice becomes a matter of collective solidarity with a view to saving everyone. It is reasonable to think that a large enough number of others who understand the choice will recognize that coordinated action is required and take the leap of faith to ensure everyone survives. Therefore one ought to do so too [EDIT: to help effect the coordinated action].

So what this comes down to is a partial denial of this:

This is true in the abstract or narrow sense. However, the lack of any such guarantee does not mean your action has no relation at all to the outcome. When enough individuals act in the same way, according to the same reasoning, outcomes that were completely uncertain become probable. And this is how collective action works in the real world.

1 Like

But suppose you didn’t have that research to draw upon when asked to choose a button. Would you still choose blue?

Red’s survival is guaranteed in both cases. This is the OP:

  1. If most push the red button then only those who pushed the red button survive
  2. If most push the blue button then everyone survives

Which is equivalent to:

  1. Those who push the red button survive
  2. Those who push the blue button survive only if most push the blue button

This second phrasing shows that pushing the blue button creates the very problem that pushing the blue button is trying to solve, fabricating the need for others to risk their lives to save yours — and so I would even argue that it’s unethical to push the blue button.

My example with the virus and the vaccine simply specifies the mechanism by which people are killed or saved, which is left unspecified in the OP. It’s a difference that doesn’t make a difference to the problem or the solution, but does illuminate the fallacious reasoning of blue voters.

They hypothesize a lack of agency on certain blue pushers, denying their moral decision making entirely. They are the subclass of blue pushers I referred to as shit for brains. The other blues are those that come to the shit for brains rescue and that demand we all join hands and try to save the shit for brains while wagging their fingers at those who don’t, ignoring we might all kill ourselves in the process.

I argue it is absolutely immoral to take unnecessary risks with your own life, and if you can’t reasonably assess that risk by pushing blue, you can’t pretend you’ve been moral.

And morality doesn’t demand heroism in any event. I don’t have to run into a burning building to save a family, and if I do, I have no right to condemn those who don’t. I can accept my hero badge humbly.

I’ll also go out on a limb and say red pushers are the sort more likely to run into the burning building who likely see heroism in individualistic acts and not in consensus building with those resistent to their own self preservation, but that’s a guess like most of this.

Which is why I think the problem, like other problems like this, ought specify that every participant is perfectly rational and perfectly ethical. We’re not being asked what we would/should do but what they would do.

Would perfectly rational and perfectly ethical agents push the red or the blue button? I say they would push the red button.

Would your analysis change if the OP stipulated 20% will vote blue due to disability? As in, they lack the capacity but to vote blue. The red button is too high on the shelf for them to reach let’s say.

Yes, I covered something like that here, and also when we discussed helping Bob with his job. If it’s not possible for everyone to guarantee their own survival then there is a rational and ethical reason to push the blue button. It’s only because it’s trivial for everyone to push the red button that pushing the blue button is the wrong choice.

That’s not to say that I think that everyone ought push the blue button if there are people who can’t push the red button. I don’t think anyone (other than perhaps those who have committed to it, like life guards) has an obligation to risk their own life to save another. It’s certainly a good thing to do, but it’s not a bad thing to not do.

Is there a rational and ethical reason to push the red button in that scenario?

I think I pre-empted your response in my edit.

The question is how ought one decide, not how will Hanover decide. It’s a thought experiment, offered to provoke differing perspectives. While it’s entertaining to assign the perspectives a poster might choose to consider as what their actual course might be and then to condemn them, it does lose sight of the academic objective. I’m not hinting I don’t believe personally in my postings and winking that I’m just carrying on to carry on, but I’m truly pointing out that it distracts from the exercise if positions can’t be objectively considered without enduring outrage over the consideration of a bizarre and strained hypothetical.

I think so. This goes back to morality and super-morality.

(@Hanover I’m replying to you as well but quoting @Michael )

Here’s another equivalent version:

Do you consent to some people dying so long as you live?

If most people say “yes”, people who said “no” die; if most people say “no”, no one dies, whatever their answer.

Here’s an even better version:

Every household or individual is given a button. If you push the button, you live. If, at the end of one month, most people have not pushed the button, everyone lives; but if most people pushed the button, then people who didn’t will die.

The second has a bit of the flavor of the marshmallow test. All you have to do is not push a button, and in a month it’ll be like this never happened.

You can clearly imagine the anxious guy getting home from work every day and staring at the button, biting his nails, trying to resist pushing the button, and the pressure becoming more unbearable each day. You can imagine the conversations in families, the fights—we have to push the button, for our children, what’s wrong with you. The simplest thing to do is smash your button as soon as it’s delivered, or throw it in the river, refuse to play, especially if you’re not sure you could hold out. Somewhere there will be an office where people who lost or broke their button, or who now wish they hadn’t thrown it in the river, can get a replacement, and the people standing in line there look scared. All day, for a month, people look at other people, on the street, at work, wondering if they pushed the button.

The rational and ethical thing to do is to push the button. Everyone is capable of doing it and in doing it everyone survives. Your refusal to save yourself does not obligate me to risk my life to save you.

It seems more that you’re using ‘cooperate’ as a moralistic weapon to demonize anyone who suggests that before we can cooperate, we must see the world in a similar way. But people simply aren’t built to think in lockstep, and this has nothing to do with ethics. I’m not arguing we are autonomous islands before we are social, I’m saying we cluster into social intelligibilities, customs and norms which are incompatible with other groups, and that can’t be overcome with the accusatory moralist incantation that we should all ‘cooperate’, lest we be judged sinners.

Rather than ‘we should all cooperate’ , a better injunction is ‘we should all work to appreciate the differences in perspective that limit our ability to cooperate’. Red button pushing can be a vote for that consideration, rather than a perverse refusal of consensus. We don’t all get along, and I think that’s because too many of us think of cooperation as a means rather than as a fragile end.