MATLAB, 30 byte
@(a)datasample(repelem(n,n),1)
Ini mengasumsikan MATLAB R2015a atau lebih baru dan dengan toolbox Statistics & Machine Learning diinstal.
Lihat penjelasan di bawah ini untuk cara repelem
penggunaannya. Perbedaan antara yang lebih pendek dan yang di bawah ini adalah bahwa kotak alat S&ML mencakup fungsi datasample
yang dapat digunakan untuk mengambil satu atau lebih elemen dari array secara acak (dengan probabilitas seragam) yang memungkinkan digunakannya fungsi anonim, menghilangkaninput/disp
panggilan.
MATLAB, 49 byte
n=input('');a=repelem(n,n);disp(a(randi(nnz(a))))
Kode ini mengasumsikan bahwa MATLAB R2015a atau yang lebih baru digunakan saat repelem
fungsi diperkenalkan.repelem
adalah fungsi yang mengambil dua parameter, yang pertama adalah array angka untuk direplikasi, dan yang kedua adalah array berapa kali elemen yang sesuai harus direplikasi. Pada dasarnya fungsi melakukan decoding run-length dengan memberikan nomor dan run-length.
Dengan memberikan input yang sama untuk kedua input repelem
kita berakhir dengan sebuah array yang terdiri dari n kali lebih banyak elemen n jika itu masuk akal. Jika Anda memberi [1 2 3]
Anda akan mendapatkan [1 2 2 3 3 3]
. Jika Anda memberi [1 2 4 2]
Anda akan mendapatkan [1 2 2 4 4 4 4 2 2]
. Dengan melakukan ini berarti jika kita memilih elemen dengan probabilitas seragam (randi(m)
memberikan bilangan bulat acak dari 1 ke m dengan probabilitas seragam), setiap elemen n memiliki probabilitas n kali lebih tinggi untuk dipilih. Pada contoh pertama [1 2 3]
, 1
akan memiliki peluang 1/6, 2
akan memiliki peluang 2/6 dan 3
akan memiliki peluang 3/6.
Sebagai catatan tambahan, karena repelem
belum tersedia untuk Octave, saya tidak dapat memberikan tautan TIO. Selain itu karena Oktaf tidak dapat digunakan ada hukuman karakter besar karena input()
dan tidak disp()
perlu digunakan sebagai fungsi anonim. Jika Oktaf didukung repelem
, berikut ini dapat digunakan:
@(n)a(randi(nnz(a=repelem(n,n))))
Itu akan menghemat 16 byte, tetapi itu tidak terjadi.