shuffle จากการสุ่มทำงานใน Python อย่างไร
ฉันถามเพราะมันใช้งานได้เร็วมาก เมื่อฉันพยายามเขียน shuffle มันจะทำงาน 1 นาทีสำหรับองค์ประกอบ 10 ^ 6 แต่ Python shuffle ทำใน 8 วินาทีหรือไม่
shuffle จากการสุ่มทำงานใน Python อย่างไร
ฉันถามเพราะมันใช้งานได้เร็วมาก เมื่อฉันพยายามเขียน shuffle มันจะทำงาน 1 นาทีสำหรับองค์ประกอบ 10 ^ 6 แต่ Python shuffle ทำใน 8 วินาทีหรือไม่
คำตอบ:
Python random.shuffle
ใช้การสับเปลี่ยน Fisher-Yatesซึ่งทำงานในเวลา O (n) และได้รับการพิสูจน์ว่าเป็นการสลับที่สมบูรณ์แบบ (สมมติว่าเป็นตัวสร้างตัวเลขสุ่มที่ดี)
มันวนซ้ำอาร์เรย์จากรายการสุดท้ายเป็นรายการแรกสลับแต่ละรายการด้วยรายการที่ดัชนีแบบสุ่มด้านล่าง
กระบวนการพื้นฐานของการสับ Fisher-Yates นั้นคล้ายคลึงกับการสุ่มเลือกหมายเลขตั๋วจากหมวกหรือไพ่จากสำรับหนึ่งต่อจากนั้นจนกว่าจะไม่มีเหลืออีก สิ่งที่อัลกอริทึมเฉพาะให้เป็นวิธีการทำตัวเลขในลักษณะที่มีประสิทธิภาพและเข้มงวดที่ทำอย่างถูกต้องรับประกันผลลัพธ์ที่เป็นกลาง ...
ทางออกที่ทันสมัย ... คือการย้ายหมายเลข "หลง" ไปยังจุดสิ้นสุดของรายการโดยสลับพวกเขาด้วยหมายเลข unstruck ครั้งสุดท้ายในแต่ละรอบ สิ่งนี้จะช่วยลดความซับซ้อนของเวลาของอัลกอริทึมเป็น O (n) เปรียบเทียบกับ O (n 2 ) สำหรับการนำไปใช้แบบไร้เดียงสา การเปลี่ยนแปลงนี้ให้อัลกอริทึมต่อไปนี้ (สำหรับอาร์เรย์ที่มี zero-based)
To shuffle an array a of n elements (indices 0..n-1): for i from n − 1 downto 1 do j ← random integer with 0 ≤ j ≤ i exchange a[j] and a[i]