Skip to content
Week 00Published

Is a seeded die actually fair?

“If I roll a virtual die 10,000 times, does every face really come up one time in six?”

The warm-up round. Ten thousand seeded rolls, four small tables, one chi-square test — and a check that every chart on this site renders real numbers.

asked 14 Sept 2026 published 18 Sept 2026PythonNumPypandasJupyter
Notebooknot linked yetResult CSVsweek-00/ on GitHubRaw datasetKaggle profileThe questionnot linked yet

Rolls simulated

10K

seed 2026

Chi-square

1.03

5 degrees of freedom

p-value

0.96

no evidence of bias

Longest streak

6×

same face in a row

01The answer
01

Every face landed within ±1.8% of the expected 1,667 rolls — the biggest miss was Face 6, up by 29.

02

A chi-square goodness-of-fit test gives χ² = 1.03 (5 degrees of freedom, p ≈ 0.96). Nothing to see: the die is fair.

03

The running mean swings wildly for the first few dozen rolls, then settles onto 3.5 — the law of large numbers, drawn as a line.

04

The longest streak of one face repeating was 6 in a row, and it happened exactly once.

Fig. 01

Rolls per face

Six bars, all within a whisker of the 1,667 a fair die expects.

Face 1
1,661
Face 2
1,659
Face 3
1,677
Face 4
1,666
Face 5
1,641
Face 6
1,696
01,0002,000

source · face_counts.csv · 6 rows

Fig. 02

Low, mid or high?

Splitting the faces into thirds: each takes almost exactly a third of the rolls.

10Krolls

source · buckets.csv · 3 rows

Fig. 03

The running mean settles on 3.5

Average of all rolls so far. Log scale on x, so the chaotic first hundred rolls get room.

2.533.544.555.561101001,00010KRoll number (log scale)Expected 3.5

source · running_mean.csv · 299 rows

Fig. 04

How long do streaks last?

Repeats are rare: a face followed by itself happens about one time in six.

02,0004,0006,0008,000
6,933
1,154
196
35
5
1
1×2×3×4×5×6×

source · streaks.csv · 6 rows

03The data

Every table behind the figures above. Sort a column, filter rows, and download exactly the view you're looking at — or grab the originals from GitHub.

6 × 4
#
1Face 116611666.7-0.34
2Face 216591666.7-0.46
3Face 316771666.70.62
4Face 416661666.7-0.04
5Face 516411666.7-1.54
6Face 616961666.71.76
04Method

Rolls come from NumPy's default_rng(2026).integers(1, 7) — a PCG64 generator with a fixed seed, so anyone re-running scripts/week-00-warmup.py gets the identical 10,000 values.

Each chart reads its own tidy CSV: face_counts (count vs. expected per face), running_mean (sampled at 300 checkpoints so the file stays small), buckets (low / mid / high thirds) and streaks (how often a face repeated n times in a row).

Fairness is judged with a chi-square goodness-of-fit test against a uniform distribution. A small χ² and a large p-value mean the observed counts are entirely consistent with a fair die.