library(tidyverse)
df <-
  tibble(n_matches = seq(30)) %>%
  mutate(n_cpds = ceiling((1 / (n_matches * 1.5) * 100)))

df

df %>%
  ggplot(aes(n_matches, n_cpds)) +
  geom_point()

generate_unif_corr <-
  function(n_matches, n_cpds) {
    seq(n_cpds) %>%
      map_dbl(~ mean(runif(n_matches)**2))
  }

sd(generate_unif_corr(1, 1000))
[1] 0.3020492
sd(generate_unif_corr(100, 1000))
[1] 0.03106674
df1 <- 
  df %>% 
  rowwise() %>% 
  mutate(avg_corr = list(corr = generate_unif_corr(n_matches, n_cpds)))

df2 <- 
  df1 %>%
  unnest(avg_corr)

df2 %>% 
  ggplot(aes(avg_corr, n_matches)) + 
  geom_point() +
  ggtitle("Random data")

LS0tCnRpdGxlOiAiU3VwcGxlbWVudGFyeSBGaWd1cmUgUzciCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgoKYGBge3J9CmRmIDwtCiAgdGliYmxlKG5fbWF0Y2hlcyA9IHNlcSgzMCkpICU+JQogIG11dGF0ZShuX2NwZHMgPSBjZWlsaW5nKCgxIC8gKG5fbWF0Y2hlcyAqIDEuNSkgKiAxMDApKSkKCmRmCgpkZiAlPiUKICBnZ3Bsb3QoYWVzKG5fbWF0Y2hlcywgbl9jcGRzKSkgKwogIGdlb21fcG9pbnQoKQpgYGAKCgpgYGB7cn0KZ2VuZXJhdGVfdW5pZl9jb3JyIDwtCiAgZnVuY3Rpb24obl9tYXRjaGVzLCBuX2NwZHMpIHsKICAgIHNlcShuX2NwZHMpICU+JQogICAgICBtYXBfZGJsKH4gbWVhbihydW5pZihuX21hdGNoZXMpKioyKSkKICB9CgpzZChnZW5lcmF0ZV91bmlmX2NvcnIoMSwgMTAwMCkpCnNkKGdlbmVyYXRlX3VuaWZfY29ycigxMDAsIDEwMDApKQpgYGAKCgpgYGB7cn0KZGYxIDwtIAogIGRmICU+JSAKICByb3d3aXNlKCkgJT4lIAogIG11dGF0ZShhdmdfY29yciA9IGxpc3QoY29yciA9IGdlbmVyYXRlX3VuaWZfY29ycihuX21hdGNoZXMsIG5fY3BkcykpKQoKZGYyIDwtIAogIGRmMSAlPiUKICB1bm5lc3QoYXZnX2NvcnIpCgpkZjIgJT4lIAogIGdncGxvdChhZXMoYXZnX2NvcnIsIG5fbWF0Y2hlcykpICsgCiAgZ2VvbV9wb2ludCgpICsKICBnZ3RpdGxlKCJSYW5kb20gZGF0YSIpCmBgYAoKCg==