MATLAB, 30 byte
@(a)datasample(repelem(n,n),1)
Điều này giả định MATLAB R2015a hoặc mới hơn và với hộp công cụ Thống kê & Máy học được cài đặt.
Xem giải thích dưới đây để biết cách repelem
sử dụng. Sự khác biệt giữa cái ngắn hơn và cái dưới đây là hộp công cụ S & ML bao gồm chức năng datasample
có thể được sử dụng để lấy một hoặc nhiều phần tử từ một mảng một cách ngẫu nhiên (với xác suất đồng nhất) cho phép sử dụng một hàm ẩn danh, loại bỏ hàminput/disp
các cuộc gọi.
MATLAB, 49 byte
n=input('');a=repelem(n,n);disp(a(randi(nnz(a))))
Mã này giả định rằng MATLAB R2015a hoặc mới hơn được sử dụng vì đó là khi repelem
chức năng được giới thiệu.repelem
là một hàm có hai tham số, đầu tiên là một mảng các số được sao chép và thứ hai là một mảng bao nhiêu lần phần tử tương ứng sẽ được sao chép. Về cơ bản, hàm thực hiện giải mã độ dài chạy bằng cách cung cấp số lượng và độ dài chạy.
Bằng cách cung cấp cùng một đầu vào cho cả hai đầu vào của repelem
chúng ta, kết thúc bằng một mảng bao gồm n phần tử nhiều hơn n lần nếu điều đó có ý nghĩa. Nếu bạn cung cấp, [1 2 3]
bạn sẽ nhận được [1 2 2 3 3 3]
. Nếu bạn cung cấp, [1 2 4 2]
bạn sẽ nhận được [1 2 2 4 4 4 4 2 2]
. Bằng cách này, điều đó có nghĩa là nếu chúng ta chọn một phần tử có xác suất đồng nhất ( randi(m)
đưa ra một số nguyên ngẫu nhiên từ 1 đến m với xác suất đồng nhất), thì mỗi phần tử n có xác suất được chọn cao hơn n lần. Trong ví dụ đầu tiên [1 2 3]
, 1
sẽ có cơ hội 1/6, 2
sẽ có cơ hội 2/6 và 3
sẽ có cơ hội 3/6.
Là một lưu ý phụ, vì repelem
chưa có sẵn cho Octave, tôi không thể cung cấp liên kết TIO. Ngoài ra, vì Octave không thể được sử dụng nên có một hình phạt nhân vật lớn input()
và disp()
không thể sử dụng như một chức năng ẩn danh. Nếu Octave được hỗ trợ repelem
, có thể sử dụng các mục sau:
@(n)a(randi(nnz(a=repelem(n,n))))
Điều đó sẽ tiết kiệm được 16 byte, nhưng thực tế không phải vậy.