This was originally published on the LK Forge blog, where the charts are interactive.
"Random" is a claim, not a given — a generator that quietly favors a handful of words isn't random, it's just unpredictable-looking. We ran 20,000 seeded draws against our Word Generator's default word pool and tested the results with a chi-square goodness-of-fit test to find out whether every word really does have an equal shot.
Across 20,000 draws from the 365-word default pool, the generator samples uniformly: chi-square = 320.572 on 364 degrees of freedom, giving p = 0.9509 — far above the 0.05 threshold for suspecting bias. No word in the pool is favored or starved over the other 364. Statistically, it's fair.
The numbers
| Draws sampled | 20,000 |
| Chi-square p-value | 0.9509 |
| Words in the default pool | 365 |
| Expected draws per word | 54.8 |
Is the sampling fair?
A chi-square goodness-of-fit test compares observed draw counts against what a perfectly uniform sampler would produce. With 20,000 draws spread across a 365-word pool, each word should show up about 54.8 times on average if every word is equally likely — that's the expected count per cell, comfortably above the rule-of-thumb minimum of 5 needed for the test to be valid without merging cells. The null hypothesis is "every word is equally likely to be drawn."
The observed chi-square statistic came out to 320.572 against 364 degrees of freedom (pool size minus one), which converts to a p-value of 0.9509. Because that p-value sits far above the 0.05 significance threshold, we fail to reject the null: the deviations we see between words are consistent with ordinary sampling noise, not favoritism. That's the whole "how random" verdict — it says nothing yet about what the generated words look like, which is a separate question below.
What a generated word looks like
This next chart is descriptive, not a randomness test: it compares how often each letter appeared across the 20,000 generated words against how often that letter appears in general English text. It answers "what does the output look like," while the chi-square test above answers "is the sampling fair." The two questions are independent — a generator can sample its pool with perfect uniformity while that pool's letter mix still differs from English at large, because the pool's word list, not the RNG, decides which letters show up.
The widest gap belongs to H: it makes up just 2.5% of letters in the generated words but 6.094% of general English text, a 3.594-point difference. That's a fact about which 365 words happen to be in this pool — plenty of them are short and H-light — not a sign of anything skewed in how those words get picked. The chi-square test above already confirmed the picking itself is uniform.
How long are generated words?
Same caveat as above: this is a description of the pool's word lengths, not a randomness measurement. Across the 20,000 draws, 6-letter words came up most often (7,190 times), closely followed by 5-letter words (6,791), with a sharp drop-off at the short end (178 three-letter words) and the long end (48 nine-letter words). That shape simply mirrors how many words of each length exist in the 365-word pool — draw uniformly from a pool with more 6-letter words than 3-letter words, and 6-letter results will naturally come up more.
What this study does — and doesn't — cover
This study characterizes one thing: the generator's default pool, the 365-word list you get with the Word type filter left on "Words." The Word Generator also ships 8 specialty category lists reachable from that same dropdown — Animals, Birds, Colors, Compound Words, Elements, Flowers, Prepositions, and Spanish Words — each drawing from its own separate word list. None of those 8 lists were sampled or tested here, and this study makes no claim about their sampling fairness or letter/length makeup. Every figure above describes the default pool only.
A seeded stand-in for Math.random()
The live Word Generator draws with JavaScript's built-in Math.random(), which isn't seedable — running it twice gives two different outcomes, so it can't be independently reproduced. For this study we substituted a seeded pseudorandom generator, mulberry32, initialized with seed 42, so anyone can re-run the exact same 20,000 draws and get the exact same chi-square result. That substitution measures the distribution the generator's sampling mechanism (a Fisher-Yates-style draw from the pool) produces, not the specific bit sequence of the browser's own random number source — the sampling logic under test is identical either way, only the source of randomness feeding it changes for reproducibility.
Reproduce it yourself
The harness is public and deterministic — one script that runs mulberry32 (seed 42) through 20,000 draws in 400 batches of 50 against the generator's shipped default 365-word pool, printing the chi-square statistic, p-value, letter-frequency table, and length distribution.
Random word generator randomness harness (public gist)
Every number on this page is printed by that one script. Run it yourself to check any figure above to the exact digit.
The interactive charts are on the LK Forge blog.
Try the tool: Word Generator


Top comments (0)