If you can tolerate doing this randomly, then
set.seed(42) # only so that you get the same results I show here
n <- 14
iter <- 1000000
scores <- integer(0)
while (iter > 0) {
  tmp <- sample(1:5, size = n, replace = TRUE)
  if (mean(tmp) > 4) {
    scores <- tmp
    break
  }
  iter <- iter - 1
}
mean(scores)
# [1] 4.142857
scores
#  [1] 5 3 5 5 5 3 3 5 5 2 5 5 4 3
Notes:
- The reason I use iterin there is to preclude the possibility of an "infinite" loop. While here it reacts rather quickly and is highly unlikely to go that far, if you change the conditions then it is possible your conditions could be infeasible or just highly improbable. If you don't need this, then removeiterand use insteadwhile (TRUE) ...; you can always interrupt R withEscape(or whichever mechanism your IDE provides).
- The reason I prefill scoreswith an empty vector and usetmpis so that you won't accidentally assume thatscoreshaving values means you have your average. That is, if the constraints are too tight, then you should find nothing, and thereforescoresshould not have values.
FYI: if you're looking for an average of 4.2, two things to note:
tol <- 0.02
# ...
  if (abs(mean(tmp) - 4.2) < tol) {
    scores <- tmp
    break
  }
# ...
where tol is some meaningful number. Unfortunately, using this seed (and my iter limit) there is no combination of 14 votes (of 1 to 5) that produce a mean that is within tol = 0.01 of 4.2:
set.seed(42)
n <- 14
iter <- 100000
scores <- integer(0)
tol <- 0.01
while (iter > 0) {
  tmp <- sample(1:5, size = n, replace = TRUE)
  # if (mean(tmp) > 4) {
  if (abs(mean(tmp) - 4.2) < tol) {
    scores <- tmp
    break
  }
  iter <- iter - 1
}
iter
# [1] 0     # <-- this means the loop exited on the iteration-limit, not something found
scores
# integer(0)
if you instead set tol = 0.02 then you will find something:
tol <- 0.02
# ...
scores
#  [1] 4 4 4 4 4 5 4 5 5 5 3 4 3 5
mean(scores)
# [1] 4.214286