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 repelem
viene utilizzato. La differenza tra questo più breve e quello sotto è che la toolbox S&ML include la funzione datasample
che 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/disp
chiamate.
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 è repelem
stata 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 repelem
noi 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]
, 1
avrebbe una probabilità 1/6, 2
avrebbe una probabilità 2/6 e 3
avrebbe una probabilità 3/6.
Come nota a margine, poiché repelem
non è 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.