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()
จำเป็นต้องใช้เนื่องจากไม่สามารถใช้งานฟังก์ชั่นนิรนามได้ หากรองรับระดับแปดrepelem
เสียงสามารถใช้สิ่งต่อไปนี้:
@(n)a(randi(nnz(a=repelem(n,n))))
นั่นน่าจะช่วยได้ 16 ไบต์ แต่ก็ไม่เป็นเช่นนั้น