This report generates and displays a reproducible,
quasi-random draw for the 2026 World Cup
Report Author: Alistair Thorpe
Report Date: 2026-07-15
Data Pull
From: https://en.wikipedia.org/wiki/2026_FIFA_World_Cup_draw
Data Pull Date: 2025-06-10
people <- c("Daniel", "Johnny", "Robert", "Nate", "Sage",
"Tom", "Molly", "Stephanie", "Alistair") #Ordered based on the Whatsapp Poll
pots <- list(
pot1 = c("**Argen-\ntina**", "~~Brazil~~", "~~England~~", "~~France~~",
"~~Germany~~", "~~Mexico~~", "~~Nether-\nlands~~", "~~Portugal~~",
"**Spain**", "~~United\nStates~~", "~~Belgium~~", "~~Canada~~"),
pot2 = c("~~Japan~~", "~~Croatia~~", "~~Switz-\nerland~~", "~~Uruguay~~",
"~~Morocco~~", "~~Senegal~~", "~~Iran~~", "~~South\nKorea~~",
"~~Ecuador~~", "~~Austria~~", "~~Australia~~", "~~Colombia~~"),
pot3 = c("~~Saudi\nArabia~~", "~~Norway~~", "~~Tunisia~~", "~~Paraguay~~",
"~~Egypt~~", "~~Algeria~~", "~~Scotland~~", "~~Uzbe-\nkistan~~",
"~~Ivory\nCoast~~", "~~Panama~~", "~~South\nAfrica~~",
"~~Qatar~~"),
pot4 = c("~~Jordan~~", "~~Cape\nVerde~~", "~~Ghana~~",
"~~Haiti~~", "~~New\nZealand~~", "~~Curacao~~", "~~Bosnia and\nHerz...~~",
"~~Czechia~~", "~~Sweden~~", "~~Turkey~~", "~~DR Congo~~", "~~Iraq~~"))
# Since 9 does not divide into 42, need to build a fair plan for the extra teams
make_bonus_plan <- function(people, seed = 4242) {
set.seed(seed) #Set the randomisation seed to 4242 since there are 42 teams and 42 is also the answer to the ultimate question of life, the universe, and everything
# Pick the 3 people who will get 6 total teams
double_people <- sample(people, 3)
single_people <- setdiff(people, double_people)
plan <- data.frame(
Person = character(0),
Pot = character(0),
stringsAsFactors = FALSE
)
# The 3 double_people get one extra from pot3 and one extra from pot4
plan <- rbind(
plan,
data.frame(
Person = rep(double_people, each = 2),
Pot = rep(c("pot3", "pot4"), times = 3),
stringsAsFactors = FALSE
)
)
# The 6 single_people split the pot1 and pot2 extras
pot1_people <- sample(single_people, 3)
pot2_people <- setdiff(single_people, pot1_people)
plan <- rbind(
plan,
data.frame(Person = pot1_people, Pot = "pot1", stringsAsFactors = FALSE),
data.frame(Person = pot2_people, Pot = "pot2", stringsAsFactors = FALSE)
)
plan
}
###
draw_world_cup <- function(people, pots, seed = 4242) {
set.seed(seed)
result <- setNames(
replicate(length(people), character(0), simplify = FALSE),
people
)
bonus_plan <- make_bonus_plan(people, seed = seed)
for (pot_name in names(pots)) {
teams <- sample(pots[[pot_name]])
n_people <- length(people)
# Base assignment: one team per person
order_people <- sample(people)
for (i in seq_len(n_people)) {
result[[order_people[i]]] <- c(result[[order_people[i]]], teams[i])
}
# Bonus teams: exactly 3 per pot
leftover_teams <- sample(teams[(n_people + 1):length(teams)])
bonus_people <- sample(bonus_plan$Person[bonus_plan$Pot == pot_name])
for (i in seq_along(leftover_teams)) {
result[[bonus_people[i]]] <- c(result[[bonus_people[i]]], leftover_teams[i])
}
}
result
}
| Person | Team_1 | Team_2 | Team_3 | Team_4 | Team_5 | Team_6 |
|---|---|---|---|---|---|---|
| Daniel |
|
|
|
kistan |
|
|
| Johnny |
|
|
Africa |
|
|
|
| Robert |
lands |
Korea |
|
|
|
|
| Nate |
States |
erland |
|
|
Herz… |
Zealand |
| Sage |
Argen- tina |
|
|
Coast |
|
|
| Tom |
|
|
|
|
|
|
| Molly |
|
|
|
|
|
|
| Stephanie | Spain |
|
|
Arabia |
Verde |
|
| Alistair |
|
|
|
|
|
|
Red font=Pot 1 Team, Blue font=Pot 2 Team, Green font=Pot 3 Team, Purple font=Pot 4 Team
In case reading code is not your idea of fun, the important thing with this draw was that I specified that the three people who had 6 teams (vs 5) were not allowed to have their extra team come from either pot 1 or pot 2 as that did not seem fair.
| PTS | W | D | L | # of Teams | |
|---|---|---|---|---|---|
| Molly | 38 | 12 | 2 | 6 | 1 |
| Stephanie | 36 | 9 | 9 | 2 | 1 |
| Nate | 34 | 10 | 4 | 8 | 0 |
| Sage | 32 | 10 | 2 | 3 | 1 |
| Daniel | 31 | 9 | 4 | 6 | 1 |
| Johnny | 31 | 9 | 4 | 7 | 0 |
| Robert | 25 | 7 | 4 | 8 | 0 |
| Alistair | 24 | 6 | 6 | 6 | 0 |
| Tom | 20 | 5 | 5 | 6 | 0 |
Final: Spain [Stephanie] vs. Argentina [Sage]
3rd place: France [Molly] vs. England [Daniel]