This report generates and displays a reproducible,
quasi-random draw for the 2026 World Cup
Report Author: Alistair Thorpe
Report Date: 2026-06-10
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 | England | Mexico | Iran |
Uzbe- kistan |
Jordan |
|
| Johnny | Germany | Morocco |
South Africa |
Algeria | Czechia | Turkey |
| Robert |
Nether- lands |
South Korea |
Egypt | Scotland | Iraq | Ghana |
| Nate |
United States |
Switz- erland |
Paraguay | Panama |
Bosnia
and Herz… |
New Zealand |
| Sage |
Argen- tina |
Brazil | Croatia |
Ivory Coast |
Sweden |
|
| Tom | Portugal | Australia | Austria | Tunisia | DR Congo |
|
| Molly | France | Senegal | Ecuador | Norway | Curacao |
|
| Stephanie | Spain | Colombia | Uruguay |
Saudi Arabia |
Cape Verde |
|
| Alistair | Belgium | Canada | Japan | Qatar | Haiti |
|
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 | |
|---|---|---|---|---|---|
| Johnny | 0 | 0 | 0 | 0 | 6 |
| Nate | 0 | 0 | 0 | 0 | 6 |
| Robert | 0 | 0 | 0 | 0 | 6 |
| Alistair | 0 | 0 | 0 | 0 | 5 |
| Daniel | 0 | 0 | 0 | 0 | 5 |
| Molly | 0 | 0 | 0 | 0 | 5 |
| Sage | 0 | 0 | 0 | 0 | 5 |
| Stephanie | 0 | 0 | 0 | 0 | 5 |
| Tom | 0 | 0 | 0 | 0 | 5 |