Why are rating distributions 'smoother' when there are more players? Consider the following rating distributions by variant/time control on lichess.
The bullet, blitz and rapid rating distributions look very, well, 'smooth' (or holomorphic/analytic or harmonic or uniformly continuous or integrable or square integrable or right continuous whatever you want) like as if they were an actual probability distribution. They have at least 300k users each.



However ultra bullet doesn't look so smooth. Only 17k users.

Similarly, 9LX (this time, this is a different variant instead of a time control. Here, time control isn't taken into account. So this can be 9LX rapid, 9LX blitz, 9LX bullet, 9LX ultrabullet, etc) isn't so smooth. Only 12k users. (Actually a surprise to me. Almost each week of past several months I've seen it at most 10k. Btw, relevant?)

Question: What's the idea behind how more players means smoother? Like as sample size grows to infinity then we approach the actual distribution? Like empirical distribution approaches theoretical distribution or something? I wanna say central limit theorem or strong/weak law of large numbers, but I think not really: Latter is about mean specifically (even if there's a convergence in distribution version), and former is about normal distribution specifically. (Wait but if this is a normal distribution, then can we assume normal distribution there too?)


What's the idea behind how more players means smoother?

First, you would need to ask why the curves are not smooth. One thing that is very peculiar is that the curves have peaks at very regular intervals, at intervals of exactly one hundred.
One way that we can explain these bumps is that it is the distribution of the result of a (sort of) random walk where the walking speeds are different depending on the current position. It can be that the algorithm for the lichess elo rating has a factor for the steps by which the new elo is computed after a game, and that this factor depends on the elo rating and changes in steps of 100.
Example simulation for bumps that are independent of sample size
Below is an example based on the simple elo rating system. It is a simulation that let's players play randomly and after one million games we plot the distribution of the elo rating.
Depending on the maximum score of the players in a game the elo is updated with a factor $K=30$ if the rating is below 1750 and $K=15$ if the elo rating is above 1750.
What you see is that this creates a bump in the distribution around the elo rating 1750. It is similar to the bumps in the lichess distributions (which probably have multiple steps in the factor $k$ instead of the example which only has a step at 1750).

When we increase the size of the pool of players by ten-fold, then we see that the bump at 1750 remains (only the 'coarseness' of the histogram decreases).

For an intuitive analogy see the equilibrium constant in chemistry. Here you get that the ratio of components depends on a difference in the rate of transfer.
Lichess lack of smoothness not all depending on population size

*

*The peaks at regular intervals of 100 elo rating points. So, these regular peaks do not seem to be a lack of smoothness of a type that is random. The random lack of smoothness would be of the type that you would expect to be relating to the sample size.
Lichess uses a slightly more complex rating than the one in the example, but it is not unimaginable that there is a similar elo-dependence that causes the bumps.


*Coarseness For the less popular games you get that the bumpy curve is actually more or less the same, but just with some coarseness in the histogram because of a smaller population, less games being played and possibly also slightly different elo rules.
R-code
n = 5*10^3
set.seed(1)
ds = seq(0,1,length.out = n)

### underlying true rating
h_rating = qnorm(ds,1500,300)
### elo rating starting at 1500
obs_rating = rep(1500,n)


game = function() {

  ### select players
  players = sample(1:n,2)
  
  ### player strengths and scores
  elo1 = obs_rating[players[1]]
  elo2 = obs_rating[players[2]]
  abil1 = h_rating[players[1]]
  abil2 = h_rating[players[2]]

  ### win probability 
  p_win1 = (1+10^((abil1-abil2)/400))^-1

  ### compute the game outcome
  win1 = rbinom(1,1,p_win1)
  win2 = 1-win1
  
  ### different K depending on elo
  if (max(elo1,elo2) > 1750) {
    Kc = 15
  } else {
    Kc = 30
  }
  
  ### update elo
  if (play1 != play2) {
    obs_rating[players[1]] <<- elo1 + Kc*(win1-p_win1)
    obs_rating[players[2]] <<- elo2 + Kc*(win2-(1-p_win1))
  }
}


### repeat many games
for (i in 1:10^6) {
  game()
}

### plot histogram of simulated elo-rating
hist(obs_rating, breaks = seq(0,3000,25), freq = 0, 
     xlim = c(700,2300),
     xlab = "elo rating", ylab = "frequency",
     main = "histogram of elo for 5000 players after 1 millon games")

