MATLAB、30バイト
@(a)datasample(repelem(n,n),1)
これは、MATLAB R2015a以降およびStatistics&Machine Learningツールボックスがインストールされていることを前提としています。
repelem使用方法については、以下の説明を参照してください。この短いものと以下のものとの違いは、S&MLツールボックスには、datasample匿名関数を使用できるようにする(均一な確率で)ランダムに配列から1つ以上の要素を取得するために使用できる関数が含まれていることですinput/disp呼び出します。
MATLAB、49バイト
n=input('');a=repelem(n,n);disp(a(randi(nnz(a))))
このコードは、MATLAB R2015a以降がrepelem関数が導入された時点で使用されていることを前提としています。repelemは2つのパラメーターを受け取る関数です。最初のパラメーターは複製される数値の配列であり、2番目のパラメーターは対応する要素が複製される回数の配列です。基本的に、関数は、数値とランレングスを提供することにより、ランレングスのデコードを実行します。
同じ入力を両方の入力に提供するrepelemことにより、意味があれば要素nのn倍以上で構成される配列になります。あなたが提供した[1 2 3]場合、あなたは得るでしょう[1 2 2 3 3 3]。あなたが提供した[1 2 4 2]場合、あなたは得るでしょう[1 2 2 4 4 4 4 2 2]。これを行うことにより、一様な確率で要素を選択した場合(randi(m)1からmまでの一様な確率でランダムな整数を与える)、各要素nが選択される確率がn倍高くなります。最初の例では[1 2 3]、11/6のチャンスを持っているでしょう22/6チャンスを持っているでしょうし、33/6チャンスを持っているでしょう。
As a side note, because repelem is not available yet for Octave, I can't give a TIO link. Additionally because Octave can't be used there is a big character penalty as input() and disp() need to be used as an anonymous function is not possible. If Octave supported repelem, the following could be used:
@(n)a(randi(nnz(a=repelem(n,n))))
That would have saved 16 bytes, but it was not to be.