Traitors null hypothesis
The rest of the UK and I have been watching the Celebrity Traitors over the past few weeks, which is basically Werewolf.
The game starts with three traitors and sixteen faithful. Each night the traitors secretly choose a faithful to kill (who does not appear the next morning). There is a round table where the group as a whole vote for who they think is a traitor, and by majority vote that person is banished, whereupon they reveal whether they were a traitor or a faithful. If at the end, a single traitor remains, the traitors win.
I haven’t seen it before, but it seemed like the celebrity faithful were doing very badly (or the traitors doing very well) as it took until the sixth night to banish the first traitor correctly. Thinking about whether I’d do any better (no), I reckoned there was very little information to go on, especially in the earlier nights, and I wondered whether they were actually doing any worse than randomly. At first, there are a lot more faithful to be banished, although they rapidly get depleted with two going each night.
I made a simple traitor simulator (see below). In 10000 games, if banishing randomly, traitors win 55% of the time. The average night at which first banishment occurs is night four, and night six is worse than 80% of games. So yes, it looks like they are worse than average (or equivalently the traitors are better than average). But not by much! The game definitely wouldn’t be considered as surprisingly bad.

Code:
traitors_null <- function(faithful, traitors, nights) {
first_victory <- NA
winner <- NA
end <- nights
for (night in 1:nights) {
# Faithful win
if (traitors == 0) {
end <- night - 1
break
}
# Kill a faithful
else if (faithful > 0 && traitors > 0) {
faithful <- faithful - 1
}
# Randomly banish
if (faithful > 0) {
draw <- runif(1)
if (draw < traitors / (faithful + traitors)) {
traitors <- traitors - 1
if (is.na(first_victory)) {
first_victory <- night
}
} else {
faithful <- faithful - 1
}
# Traitors won
} else {
end <- night
break
}
}
if (traitors > 0) {
winner <- 1
} else {
winner <- 0
}
c(winner, first_victory, end, traitors, faithful)
}
faithful <- 16
traitors <- 3
nights <- 9
trials <- 10000
simulate <- replicate(trials, traitors_null(faithful, traitors, nights))
hist(simulate[2,], breaks = c(1:9), xlab = "Nights", main = "Nights until first traitor banishment")
hist(simulate[3,], breaks = c(1:9), xlab = "Nights", main = "Time to end")
win_rate <- mean(simulate[1,])
quantile(simulate[2,], c(0.025, 0.5, 0.975), na.rm = TRUE)