The power of two random choices
brooker.co.za
brooker.co.za
If the balls are thrown independently and uniformly at random, the most loaded bin will have theta(log n) balls in it (almost certainly).
If you instead pick two bins uniformly and independently at random for each ball and throw the ball into the bin which has fewer balls in it so far, then the most loaded bin will have theta(loglog n) balls in it, i.e a massive asymptotic improvement.
Another interesting example is hash-based partitioning of data. It doesn't spread data out nearly as evenly as one might expect!
(I wrote a blog post about that too: https://brooker.co.za/blog/2018/01/01/balls-into-bins.html)
As an example, many computing systems are Markovian, which is memoryless with an exponential distribution.
So the second part of I.I.D. doesn't hold. But may be close enough for your needs.
Too many convenient properties are lost once you lose IID to prematurely drop it.
I kinda wonder now if the crossover points between best, 3, 2, and 1 are equidistant on a log-scale plot. If I squint a little, I could maybe see 4, 16, and 64 being the approximate crossover points, especially if there was a little less noise.
That said, sampling, in general, works surprisingly well in all things.
For example: https://en.wikipedia.org/wiki/Secretary_problem
This phenomenon is common with cars using traffic-aware navigation, too.
Caches: LRU vs. Random (2014) (danluu.com)
Not my experience at all. Centralised load balancer are simple, easy to maintain, and just works.
My rule of thumb is to always always always avoid distributed computations as much as possible. Trying to avoid a “single point of failure” always in my experience leads to more complex failure scenarios, making your system more likely to fail in hard to fix ways.