MATLAB, 30 bytes
@(a)datasample(repelem(n,n),1)
Esto asume MATLAB R2015a o más reciente y con la caja de herramientas Estadísticas y Aprendizaje automático instalada.
Vea la explicación a continuación para saber cómo repelemse usa. La diferencia entre este más corto y el siguiente es que la caja de herramientas S&ML incluye la función datasampleque se puede usar para tomar uno o más elementos de una matriz al azar (con probabilidad uniforme) que permite usar una función anónima, eliminando elinput/disp llamadas.
MATLAB, 49 bytes
n=input('');a=repelem(n,n);disp(a(randi(nnz(a))))
Este código supone que se usa MATLAB R2015a o más reciente, ya que es cuando repelemse introdujo la función.repelemes una función que toma dos parámetros, el primero es una matriz de números que se replicarán y el segundo es una matriz de cuántas veces se debe replicar el elemento correspondiente. Esencialmente, la función realiza la decodificación de longitud de ejecución proporcionando el número y la longitud de ejecución.
Al proporcionar la misma entrada a ambas entradas repelem, terminamos con una matriz que consta de n veces más del elemento n si eso tiene sentido. Si lo proporcionaras [1 2 3]obtendrías [1 2 2 3 3 3]. Si lo proporcionaras [1 2 4 2]obtendrías [1 2 2 4 4 4 4 2 2]. Al hacer esto, significa que si seleccionamos un elemento con probabilidad uniforme ( randi(m)da un número entero aleatorio de 1 am con probabilidad uniforme), cada elemento n tiene una probabilidad n veces mayor de ser seleccionado. En el primer ejemplo de [1 2 3], 1tendría una probabilidad de 1/6, 2tendría una probabilidad de 2/6 y 3tendría una probabilidad de 3/6.
Como nota al margen, debido a que repelemaún no está disponible para Octave, no puedo dar un enlace TIO. Además, debido a que Octave no se puede usar, hay una gran penalización de caracteres input()y disp()no es posible usarlo como una función anónima. Si Octave es compatible repelem, se podría utilizar lo siguiente:
@(n)a(randi(nnz(a=repelem(n,n))))
Eso habría ahorrado 16 bytes, pero no fue así.