Or: How I Learned to Stop Worrying and Love the Coupon Collector’s Problem
Somewhere around encounter number 3,472,891,556, I realized I’d built a machine to quantify heartbreak.
Let me back up.
The Question That Wouldn’t Shut Up
If you’ve ever hunted shiny Pokémon, you know the feeling. That little voice that whispers after your 47th consecutive Pidgey: “What if I tried to get them all?”
And then the rational part of your brain—the part that has bills to pay and relationships to maintain—screams back: “Are you insane? Do you have any idea how long that would take?”
The thing is… nobody had put real numbers to it. Sure, we had the shiny rate (1 in 4,096), and we could do some napkin math about probabilities. But a proper answer—one that accounts for weighted spawn rates, catch rates, the cosmic joke of finding a shiny Abra only to watch it teleport into the void?
That answer didn’t exist. At least, not in the way I wanted to explore it.
So I built a model. Not the answer—because let’s be real, there are so many variables I didn’t account for: outbreaks, events, gift Pokémon, trading, shiny-locked species, time-gated encounters, and about fifty other mechanics that could swing your actual experience wildly in either direction.
But I wanted to isolate two specific factors—spawn rate and catch rate—and see what they could tell us about the grind. I wanted to build a version of this nightmare and let it run until it was done.
Building a Time Machine (That Only Goes Sideways)
I already knew Python and Power BI, but knowing something and using it to build something ridiculous are very different things. This project became my playground for sharpening those skills—the kind of obsessed where you think “I wonder if I could…” at 2 AM and somehow three months later you’ve written a simulation that can run for 72 hours straight without breaking.
Here’s what I built:
The Setup:
- A complete Pokédex of 1,240 Pokémon pulled from actual game data
- Weighted spawn rates based on Experience Types (Slow, Medium Slow, Fast, etc.) to simulate rarity
- Individual catch rates for every single species
- A checkpoint system because apparently when you’re running billions of encounters, your computer will try to restart for updates at the worst possible moment
The Goal: Catch at least one shiny version of every single Pokémon. That’s it. That’s the whole nightmare.
The Reality: It took 6,759,893,105 encounters.
Let me write that out again so it can hurt properly: Six billion, seven hundred fifty-nine million, eight hundred ninety-three thousand, one hundred and five encounters.

The Data Doesn’t Pull Punches
I could tell you the simulation ran for 72.4 hours. I could mention that I caught 664,018 shinies total. But those numbers don’t really convey the experience of what the data revealed.
So let me tell you about Arceus-Fairy.
Arceus-Fairy appeared 495 times as a shiny across 1.9 million encounters. You know how many I caught? One. A 0.2% catch rate. I watched 494 shiny Arceus-Fairy encounters slip through my fingers because the catch mechanics said “lol no.”
Or let’s talk about that beautiful exponential curve—the one that haunts the Coupon Collector’s Problem. The first 100 unique shinies? They came relatively quick. The last 10? They took forever. By the end, I was wading through thousands of duplicate shinies just to find that one stubborn species that refused to show up.
That’s the thing nobody tells you: Finding the shiny is only half the battle.
The Brutal Truths in the Numbers:
1. Catch Rate is King Pokémon with a base catch rate of 255? 100% catch rate on shinies. Every. Single. Time. Pokémon with low catch rates? Zangoose and Yanma showed up over 100 times each. I caught less than 30% of those encounters. The math doesn’t care about your feelings.

2. Rarity is a Multiplier of Pain The simulation proved that Experience Types worked perfectly as a rarity system. “Slow” Pokémon had a 17.52% shiny catch rate overall. “Erratic” (common) Pokémon? 42.71%. The rare stuff doesn’t just spawn less—when it finally shows up shiny, it’s harder to catch.

3. The End Game is Exponential Hell That curve is the villain of this story. It’s not a steady climb—it’s a sprint, then a jog, then a crawl, then lying face-down in the dirt wondering why you’re like this.
What This Actually Means (Within the Model, Anyway)
I ran this simulation because I wanted to explore something specific: what happens when you isolate spawn mechanics and catch mechanics and let them play out at scale? Not the full picture—I’m not accounting for Masuda Method breeding, shiny charm bonuses, community day events, or any of the dozen ways real players optimize their hunts. I’m definitely not touching the nightmare that is shiny-locked, trade-evolution, or time-gated Pokémon.
But what I did get was something valuable: proof of concept.
Proof that the shiny hunting experience isn’t just about patience or luck—it’s about navigating multiple layers of probability that compound in ways that make the journey genuinely unpredictable. Within this model, the spawn rate, the shiny roll, the catch attempt—each one is a gate you have to pass through, and each one can slam in your face.
This isn’t the answer to “how long does it take?” It’s an answer to “what does the grind look like when these two specific variables are in play?” And even in this simplified version, the numbers are kind of beautiful in how brutal they are.
The average encounters per unique shiny? 4,089.92 encounters. But that average hides so much variance. Shinx showed up early and caught easy. Cradily showed up constantly (most common shiny by far). Carvanha? That beautiful disaster was the least encountered Pokémon in the entire simulation—1,926,165 total encounters to find just 412 shinies, with less than a 1% catch rate.
The Love Letter
I learned Python for this. I learned Power BI for this. I learned how to wrangle data, optimize loops, build checkpoint systems, and create visualizations that actually tell a story.
But more than that, I learned that sometimes you have to build the thing just to see if you can. Not because it’s practical. Not because anyone asked for it. But because there’s a question burning in your brain and the only way to put out the fire is to find the answer yourself.
This project took months. It was frustrating and beautiful and occasionally made me question my life choices at 4 AM when the simulation crashed and I realized I forgot to save a checkpoint.
But I did it. And now the data exists.
For Anyone Who Wants to Suffer With Me
I’ve put the entire project on GitHub—the Python scripts, the data processing pipeline, the checkpoint system, everything. You can run this yourself. You can modify the spawn rates, change the shiny odds, add new mechanics. You can make it worse if you’re feeling particularly masochistic.
GitHub Repository: https://github.com/rela82me/shiny-encounter-simulation
The raw data is there too. All 1,652,816 shiny encounters logged and ready for analysis. If you’re a data nerd, a Pokémon fan, or just someone who likes staring into the mathematical void, it’s yours.

The Last Thing
I started this project with a simple question: “How long would it really take?”
I’m ending it with a more nuanced answer: “It depends on a lot of things I didn’t simulate, but here’s what happens when you focus on spawn rates and catch mechanics specifically.”
This isn’t the final word on shiny hunting. It’s one lens, one model, one way of looking at the problem. Your actual mileage will vary wildly depending on how you hunt, what methods you use, which game you’re playing, and whether you’re willing to engage with trading, events, or any of the other systems that make this pursuit more (or less) painful.
But within the scope of this simulation? The Coupon Collector’s Problem doesn’t lie. The exponential curve doesn’t care. The last few shinies will take forever. And when you finally get that notification—when the simulation finally ends and every single Pokémon has appeared in sparkles at least once—there’s this weird, quiet satisfaction.
You did it. Within the parameters you set, the math said you would. The data proved it. And somewhere in those 6.7 billion encounters, you learned that sometimes the answer to “why?” is just “because I wanted to see what would happen.”
And honestly? That’s enough.
More experiments, simulations, and data-driven descents into madness at joshualown.org
Thanks for reading. Now go catch something shiny. But maybe… don’t try to catch them all.
Leave a Reply
You must be logged in to post a comment.