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 байт, але цього не було.