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


0.1 Participants

people <- c("Daniel", "Johnny", "Robert", "Nate", "Sage", 
            "Tom", "Molly", "Stephanie", "Alistair") #Ordered based on the Whatsapp Poll

0.2 Team Pots

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"))

0.3 Draw Function

# 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
}

0.4 Run Draw

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.

0.5 League table

  • Updated as often as possible (likely weekly)
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

0.6 Winners

  • 1st, 2nd, 3rd place Team finishes TBD…