A few months ago I built a daily brain-training game with prize tournaments — ten small cognitive games, a fresh challenge every day, and a leaderboard that decides who wins real rewards. The first design question wasn't about graphics or game feel. It was this:
If everyone is competing on a "random" puzzle, how do you make sure everyone got the same random puzzle — and that nobody can lie about their score?
Those are actually two problems, and they pull in opposite directions. Fairness wants the randomness to be shared and predictable — every player on a given day should face the identical challenge, or the leaderboard is meaningless. Anti-cheat wants the server to be able to independently verify a score without trusting the player's device. The thing that solves both at once is a seeded RNG.
This post is about that pattern: how a single short string makes a "random" puzzle identical for every player and recomputable on the server, why I deliberately made the seed public (the opposite of what you'd do for a high-score game), and the one game that broke the whole model and forced me to think differently.
A quick note on stack: my client is Flutter (Dart) and my backend is TypeScript edge functions, so that's what the snippets look like. But the idea is language-agnostic — it works the same with Kotlin, React Native, or anything else. The trick isn't the language, it's getting two different runtimes to agree on what "random" means.








