Esto no es práctico, pero sí bonito; bonito, además, de esa forma inasequible a la chusma

Va de muestrear los números 1, \dots, n que tienen asignadas probabilidades p_1, \dots, p_n. Una manera muy impráctica (en R, basta usar sample) y nada intuitiva de hacerlo es recurriendo a la distribución de Gumbel:

library(evd)

pes <- runif(5)
pes <- pes / sum(pes)
gammas <- log(pes) + 2
x <- rgumbel(length(pes))
muestra <- which.max(gammas + x)

O, en masa, aplicando

get_samples <- function(n){
    replicate(n, {
        x <- rgumbel(length(pes))
        which.max(gammas + x)
    })
}

El seudocódigo está extraído de la Wikipedia y el motivo por el que la cosa funciona en lugar de no funcionar, que es la parte bonita del asunto, está explicado aquí.