Point ‘1’ is basically OK. If the ANOVA null hypothesis is true, the expected value of $p$ is $0.5$, and @BruceET’s answer helps to build intuitions about why that is the case. “About $1$” is a reasonable gloss for the expected value of $F$ under the ANOVA null hypothesis, although how close to $1$ depends on the value of $d_2$. More precisely, the expected value of $F$ under the ANOVA null hypothesis is $\frac{d_2}{d_2−2}$).
Point ‘2’ is fine.
The real problem occurs in point ‘3’. As @nope notes, a $p$-value of $0.5$ should be expected at the theoretical median ($F^{−1}(0.5)$), and not the expected value of, $F$.
I present some further discussion, which will be overly basic for some viewers of this site, but which was helpful for convincing my interlocutor that something had indeed gone wrong at point ‘3’.
In ANOVA applications $d_1$ will be $< d_2$, seeing as $d_1$ is calculated as $k-1$, while $d_2$ is calculated as $N-k$, where $N$ is the sample size and $k$ is the number of groups.
While $d_1 < d_2$ the actual distribution of $F$s under the null hypothesis contains many $F$-values $< 1$, with the average $F$-value dragged upwards to $≈1$ by the occasional large $F$-value. Thus the median $F$ produced under the null hypothesis (the $F$ which accords to $p=0.5$) is $< 1$.
I have pasted below some R code which generates a plot of the empirical distribution of randomly sampled $F$-values in an ANOVA scenario when there are $3$ groups of $30$ subjects (i.e. $d_1=2,d_2=87)$, and the null hypothesis is true.
It’s easy to see that this closely matches the theoretical distribution of $F$-values.
number_of_groups <- 3
group_size <- 30
mean <- 100
sd <- 15
num_samples <- 30000
percentile <- 50 # 50 for median, 95 for critical F-value at α=0.05, etc
sampled_Fs <- vector(mode = "numeric", length = num_samples)
sampled_Ps <- vector(mode = "numeric", length = num_samples)
d1 <- number_of_groups - 1
d2 <- group_size * number_of_groups - number_of_groups
for(i in 1:num_samples) {
x = rnorm(number_of_groups*group_size, mean, sd)
g = rep(1:number_of_groups, each=group_size)
ANOVA_results <- aov(x ~ as.factor(g))
sampled_Fs[i] <- summary(ANOVA_results)[[1]][["F value"]][[1]]
sampled_Ps[i] <- summary(ANOVA_results)[[1]][["Pr(>F)"]][[1]]
}
sprintf("Under the null hypothesis the expected value of F(d1=%d,d2=%d) is %f", d1, d2, (d2/(d2-2)))
sprintf("Across %d random samples, the mean F(d1=%d,d2=%d) was %f", num_samples, d1, d2, mean(sampled_Fs))
sprintf("Across %d random samples, the mean p-value was %f", num_samples, mean(sampled_Ps))
sprintf("Under the null hypothesis the %fth percentile of the F-value (d1=%d, d2=%d) is expected to be %f", percentile, d1, d2, qf(percentile/100,d1,d2))
sprintf("Across %d random samples, the F-value (d1=%d, d2=%d) at the %fth percentile was %f", num_samples, d1, d2, percentile,quantile(sampled_Fs,percentile/100))
hist(sampled_Fs,breaks="FD",xlim=c(0, 10),xlab="F-value",col="skyblue2",main=paste(num_samples,"randomly sampled F-values under the\n ANOVA null hypothesis with d1 =", d1, "and d2 =",d2))
curve(df(x, d1, d2), from=0, to=10, xlab="F-value", ylab="Probability density",main=paste("PDF for F-distribution with d1 =", d1, "and d2 =",d2))