การสุ่มแบบ Python ทำงานอย่างไร


11

shuffle จากการสุ่มทำงานใน Python อย่างไร

ฉันถามเพราะมันใช้งานได้เร็วมาก เมื่อฉันพยายามเขียน shuffle มันจะทำงาน 1 นาทีสำหรับองค์ประกอบ 10 ^ 6 แต่ Python shuffle ทำใน 8 วินาทีหรือไม่


14
ทำไมไม่ลองดูซอร์สโค้ดล่ะ?
เฉื่อยชา

4
อัลกอริทึมแบบสุ่มที่ดีที่สุดคือแบบสุ่มของFisher-yatesมันทำงานในเวลา O (n) และได้รับการพิสูจน์ว่าเป็นแบบสุ่มที่สมบูรณ์แบบ (สมมติว่าเป็นแหล่งสุ่มที่ดี)
ratchet freak

1
@ratchetfreak: Python ใช้ Fisher-Yates
Martijn Pieters

1
อัลกอริทึมของคุณสำหรับการสลับคืออะไร
whatsisname

@sloth, โดยวิธีการ, Raymond Hettinger เสนอวิธีปฏิบัติสากลของเอกสารที่เชื่อมโยงกลับไปยังซอร์สโค้ดย้อนกลับไปในปี 2011
Cristian Ciupitu

คำตอบ:


17

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]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.