MATLAB, 30 байтов
@(a)datasample(repelem(n,n),1)
Это предполагает наличие MATLAB R2015a или более новой версии с установленным набором инструментов «Статистика и машинное обучение».
Смотрите объяснение ниже, как repelemэто используется. Разница между этим более коротким и приведенным ниже состоит в том, что набор инструментов S & ML включает в себя функцию, datasampleкоторая может использоваться для случайного выбора одного или нескольких элементов из массива (с одинаковой вероятностью), что позволяет использовать анонимную функцию, удаляя input/dispзвонки.
MATLAB, 49 байтов
n=input('');a=repelem(n,n);disp(a(randi(nnz(a))))
В этом коде предполагается, что используется MATLAB R2015a или новее, как тогда, когда repelemбыла введена функция. repelemэто функция, которая принимает два параметра, первый - это массив чисел, подлежащих репликации, а второй - массив того, сколько раз должен быть реплицирован соответствующий элемент. По сути, функция выполняет декодирование длин серий, предоставляя номер и длину серий.
Предоставляя одинаковые входные данные обоим входам, 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], 1будет иметь 1/6 шанс, 2будет иметь 2/6 шанс , и 3будет иметь 3/6 шанс.
В качестве примечания, поскольку repelemдля Octave пока нет, я не могу дать ссылку на TIO. Кроме того , поскольку Октав не может быть использован там большой штраф характер , как input()и disp()нужно использовать в качестве анонимной функции не представляется возможным. Если Octave поддерживается repelem, можно использовать следующее:
@(n)a(randi(nnz(a=repelem(n,n))))
Это позволило бы сэкономить 16 байтов, но этого не произошло.