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

Va de muestrear los números $latex 1, \dots, n$ que tienen asignadas probabilidades $latex 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:

1
2
3
4
5
6
7
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

1
2
3
4
5
6
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í.