MATLAB, 30 bytes
@(a)datasample(repelem(n,n),1)
Isso pressupõe o MATLAB R2015a ou mais recente e com a caixa de ferramentas Estatísticas e aprendizado de máquina instalada.
Veja a explicação abaixo para saber como repelem
é usado. A diferença entre este menor e o abaixo é que a caixa de ferramentas S&ML inclui a função datasample
que pode ser usada para obter um ou mais elementos de uma matriz aleatoriamente (com probabilidade uniforme), o que permite que uma função anônima seja usada, eliminando oinput/disp
chamadas.
MATLAB, 49 bytes
n=input('');a=repelem(n,n);disp(a(randi(nnz(a))))
Este código pressupõe que o MATLAB R2015a ou mais recente seja usado como quando a repelem
função foi introduzida. repelem
é uma função que aceita dois parâmetros, o primeiro é uma matriz de números a serem replicados e a segunda é uma matriz de quantas vezes o elemento correspondente deve ser replicado. Essencialmente, a função executa decodificação de duração, fornecendo o número e a duração.
Ao fornecer a mesma entrada para ambas as entradas repelem
, terminamos com uma matriz que consiste em n vezes mais do elemento n, se isso faz sentido. Se você forneceu [1 2 3]
, receberia [1 2 2 3 3 3]
. Se você forneceu [1 2 4 2]
, receberia [1 2 2 4 4 4 4 2 2]
. Ao fazer isso, significa que, se selecionarmos um elemento com probabilidade uniforme ( randi(m)
fornecer um número inteiro aleatório de 1 a m com probabilidade uniforme), cada elemento n terá uma probabilidade n vezes maior de ser selecionado. No primeiro exemplo de [1 2 3]
, 1
teria uma chance de 1/6, 2
teria uma chance de 2/6 e 3
teria uma chance de 3/6.
Como uma observação lateral, como repelem
ainda não está disponível para o Octave, não posso fornecer um link TIO. Além disso, porque Octave não pode ser utilizado há uma penalidade de caráter grande quanto input()
e disp()
necessidade de ser usado como uma função anônima não é possível. Se o Octave suportasse repelem
, o seguinte poderia ser usado:
@(n)a(randi(nnz(a=repelem(n,n))))
Isso teria economizado 16 bytes, mas não era para ser.