MATLAB, 30 byte
@(a)datasample(repelem(n,n),1)
Ciò presuppone MATLAB R2015a o più recente e con la casella degli strumenti Statistica e apprendimento automatico installata.
Vedere la spiegazione di seguito per come repelemviene utilizzato. La differenza tra questo più breve e quello sotto è che la toolbox S&ML include la funzione datasampleche può essere usata per prendere uno o più elementi da un array a caso (con probabilità uniforme) che consente di usare una funzione anonima, togliendo input/dispchiamate.
MATLAB, 49 byte
n=input('');a=repelem(n,n);disp(a(randi(nnz(a))))
Questo codice presuppone che sia utilizzato MATLAB R2015a o più recente quando è repelemstata introdotta la funzione. repelemè una funzione che accetta due parametri, il primo è un array di numeri da replicare e il secondo è un array di quante volte deve essere replicato l'elemento corrispondente. In sostanza, la funzione esegue la decodifica della lunghezza fornendo il numero e la lunghezza della corsa.
Fornendo lo stesso input ad entrambi gli input di repelemnoi finiamo con un array che consiste di n volte di più dell'elemento n se questo ha senso. Se lo avessi fornito [1 2 3]lo avresti ottenuto [1 2 2 3 3 3]. Se lo avessi fornito [1 2 4 2]lo avresti ottenuto [1 2 2 4 4 4 4 2 2]. In questo modo significa che se selezioniamo un elemento con probabilità uniforme ( randi(m)da un intero casuale da 1 a m con probabilità uniforme), ogni elemento n ha una probabilità n volte maggiore di essere selezionato. Nel primo esempio di [1 2 3], 1avrebbe una probabilità 1/6, 2avrebbe una probabilità 2/6 e 3avrebbe una probabilità 3/6.
Come nota a margine, poiché repelemnon è ancora disponibile per Octave, non posso fornire un collegamento TIO. Inoltre, perché Octave non può essere utilizzato è prevista una penale grande carattere input()e disp()necessità di essere usato come una funzione anonima non è possibile. Se Octave è supportatorepelem , è possibile utilizzare quanto segue:
@(n)a(randi(nnz(a=repelem(n,n))))
Ciò avrebbe salvato 16 byte, ma non lo era.