อัลกอริทึมแรกสร้างตัวเลขที่เว้นระยะเท่ากันเกินไป
ดูเพิ่มเติมชุดความคลาดเคลื่อนต่ำ
สมมติว่าคุณต้องการที่ 2 ตัวเลขสุ่มใน1] ด้วยข้อมูลที่เหมือนกันจริงโอกาสคือ 50:50 พวกเขาทั้งใหญ่กว่าหรือเล็กกว่า 0.5 ในเวลาเดียวกัน โอกาสของคุณคือ 0 ดังนั้นข้อมูลของคุณไม่เหมือนกัน[ 0 ; 1 ]
(เป็นแหลมออกมานี้อาจจะเป็นเช่นคุณสมบัติที่ต้องการสำหรับการแบ่งชั้น. ชุดต่ำแตกต่างเช่น Halton และโชเบลไม่ได้มีกรณีการใช้งานของพวกเขา.)
วิธีการที่เหมาะสม แต่มีราคาแพง (สำหรับค่าจริง)
... คือการใช้ตัวเลขสุ่มกระจายเบต้า สถิติอันดับของการแจกแจงแบบกระจายนั้นเป็นแบบเบต้า คุณสามารถใช้วิธีนี้ในการวาดภาพที่เล็กที่สุดจากนั้นทำซ้ำที่เล็กที่สุดที่สอง ... ซ้ำ
สมมติว่าข้อมูลจะถูกสร้างขึ้นใน1] ค่าที่เล็กที่สุดคือกระจาย (สำหรับกรณีที่ตามมาลดและ rescale เป็นช่วงเวลาที่เหลือ) ในการสร้างการสุ่มเบต้าแบบทั่วไปเราจะต้องสร้างค่าสุ่มแกมมากระจายสองค่า แต่1] จากนั้น[N] เราสามารถสุ่มตัวเลขสุ่มจากการแจกแจงนี้เป็นสำหรับสิ่งนี้[ 0 ; 1 ]เบต้า[ 1 , n ]n1 - X∼ Beta [ n , 1 ]- ln( 1 - X) ∼ เลขชี้กำลัง[ n ]- ln( ยู[ 0 ; 1 ] )n
- ln( 1 - x )1 - xx= - ln( 1 - คุณ)n= u1n= 1 - คุณ1n
ซึ่งให้อัลกอริทึมดังต่อไปนี้:
x = a
for i in range(n, 0, -1):
x += (b-x) * (1 - pow(rand(), 1. / i))
result.append(x)
อาจมีความไม่แน่นอนเชิงตัวเลขที่เกี่ยวข้องและการคำนวณpow
และการหารสำหรับวัตถุทุกอย่างอาจช้ากว่าการเรียงลำดับ
สำหรับค่าจำนวนเต็มคุณอาจต้องใช้การแจกแจงแบบอื่น
การเรียงลำดับมีราคาถูกอย่างไม่น่าเชื่อดังนั้นเพียงแค่ใช้มัน
แต่ไม่ต้องกังวล การเรียงลำดับนั้นราคาถูกมาก ในช่วงหลายปีที่ผ่านมาเราเข้าใจดีว่าจะใช้อัลกอริธึมการเรียงลำดับที่การเรียงลำดับคู่ไม่คุ้มที่จะหลีกเลี่ยง ในทางทฤษฎีมันเป็นแต่เทอมคงที่มีขนาดเล็กอย่างน่าขันในการใช้งานที่ดีว่านี่เป็นตัวอย่างที่สมบูรณ์แบบว่าผลลัพธ์เชิงความซับซ้อนเชิงทฤษฎีไร้ประโยชน์สามารถเป็นอย่างไร เรียกใช้เกณฑ์มาตรฐาน สร้าง 1 ล้าน randoms ทั้งที่มีและไม่มีการเรียงลำดับ เรียกใช้สองสามครั้งและฉันจะไม่แปลกใจหากการเรียงลำดับมักจะเต้นแบบไม่เรียงเนื่องจากค่าใช้จ่ายในการคัดแยกจะยังคงน้อยกว่าข้อผิดพลาดการวัดของคุณมากO ( n บันทึกn )
R
มันเป็นเรื่องง่ายอย่างน่าทึ่งเพื่อสร้างรายการของตัวเลขสุ่มเรียงใน เพื่อที่จะสร้างอาร์เรย์ของชุดตัวเลขสุ่มมากกว่าช่วงเครื่องแบบ , รหัสต่อไปนี้การทำงาน:rand_array <- replicate(k, sort(runif(n, a, b))