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 repelem
se usa. La diferencia entre este más corto y el siguiente es que la caja de herramientas S&ML incluye la función datasample
que 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 repelem
se introdujo la función.repelem
es 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]
, 1
tendría una probabilidad de 1/6, 2
tendría una probabilidad de 2/6 y 3
tendría una probabilidad de 3/6.
Como nota al margen, debido a que repelem
aú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í.