ฉันรู้ว่าโพสต์นี้อายุเกือบ 4 ปี แต่ฉันเป็น cryptanalyst อดิเรกและได้รับการศึกษายันต์บัตรเล่น เป็นผลให้ฉันกลับมาที่โพสต์นี้ซ้ำแล้วซ้ำอีกเพื่ออธิบายสำสับไพ่ในฐานะที่มาของเอนโทรปีสำหรับการสุ่มคีย์สำรับ ในที่สุดฉันตัดสินใจที่จะตรวจสอบคำตอบโดย stachyra โดยการสับสำรับด้วยมือและประเมินเอนโทรปีของสำรับหลังจากการสับแต่ละครั้ง
TL; DR เพื่อเพิ่มเอนโทรปีของสำรับ:
- สำหรับการสับแบบระลอกคลื่นเท่านั้นคุณต้องมีการสับ 11-12
- สำหรับการตัดที่ดาดฟ้าก่อนจากนั้นจึงทำการสับแบบระลอกคลื่นคุณต้องใช้การตัดและสับ 6-7 ครั้งเท่านั้น
ก่อนอื่นทุกอย่างที่ stachyra กล่าวถึงสำหรับการคำนวณเอนโทรปีของแชนนอนนั้นถูกต้อง สามารถต้มด้วยวิธีนี้:
- กำหนดค่าที่เป็นเอกลักษณ์ให้กับไพ่ 52 ใบในสำรับแต่ละใบ
- สุ่มดาดฟ้า
- สำหรับ n = 0 ถึง n = 51 ให้บันทึกแต่ละค่าของ (n - (n + 1) mod 52) mod 52
- นับจำนวนการเกิดขึ้นของ 0, 1, 2, ... , 49, 50, 51
- ทำให้ปกติบันทึกเหล่านั้นโดยการหารด้วย 52
- สำหรับ i = 1 ถึง i = 52 ให้คำนวณ -p_i * log (p_i) / log (2)
- รวมค่า
ที่ stachyra ทำให้สมมติฐานหนึ่งที่ลึกซึ้งคือการใช้การสับเปลี่ยนคนในโปรแกรมคอมพิวเตอร์จะมาพร้อมกับสัมภาระบางส่วน ด้วยการเล่นไพ่แบบใช้กระดาษน้ำมันจากมือของคุณจะถูกส่งไปยังการ์ด เมื่อเวลาผ่านไปนานขึ้นเนื่องจากการสะสมน้ำมันการ์ดจะเริ่มเกาะติดกันและสิ่งนี้จะจบลงในการสลับของคุณ ยิ่งมีการใช้สำรับมากเท่าไหร่ไพ่ที่อยู่ติดกันสองใบหรือมากกว่าจะติดกันและยิ่งเกิดขึ้นบ่อยขึ้น
ยิ่งกว่านั้นสมมุติว่าทั้งสองสโมสรและแจ็คของหัวใจติดกัน พวกเขาอาจติดกันด้วยกันในระหว่างการสับของคุณโดยไม่แยก สิ่งนี้สามารถเลียนแบบได้ในโปรแกรมคอมพิวเตอร์ แต่นี่ไม่ใช่กรณีของรูทีน R ของ stachyra
นอกจากนี้ stachyra ยังมีตัวแปรการจัดการ "mixprob" โดยไม่เข้าใจตัวแปรนี้อย่างสมบูรณ์มันเป็นกล่องดำเล็กน้อย คุณตั้งค่าไม่ถูกต้องซึ่งส่งผลต่อผลลัพธ์ ดังนั้นฉันต้องการทำให้แน่ใจว่าสัญชาตญาณของเขาถูกต้อง ดังนั้นฉันจึงตรวจสอบด้วยมือ
ฉันสับไพ่ 20 ครั้งด้วยมือในสองกรณีที่แตกต่างกัน (40 สับทั้งหมด) ในตัวอย่างแรกฉันเพียงแค่ระลอกคลื่นน้อย ๆ ทำให้การตัดขวาและซ้ายใกล้เคียงกัน ในตัวอย่างที่สองฉันตัดดาดฟ้าโดยเจตนาให้ห่างจากกลางดาดฟ้า (1/3, 2/5, 1/4 และอื่น ๆ ) ก่อนที่จะทำการตัดให้สม่ำเสมอสำหรับการสลับแบบ riffle ความรู้สึกของฉันในกรณีที่สองคือโดยการตัดดาดฟ้าก่อนที่จะสับและอยู่ห่างจากตรงกลางฉันสามารถแนะนำการแพร่กระจายสู่สำรับได้เร็วกว่าการสลับสับเปลี่ยนหุ้น
นี่คือผลลัพธ์ ขั้นแรกให้สับแบบระลอกคลื่นตรง:
และนี่คือการตัดดาดฟ้ารวมกับการสับแบบ riffle:
ดูเหมือนว่าเอนโทรปีจะถูกขยายให้ใหญ่สุดในเวลาประมาณ 1/2 เวลาของการเรียกร้องโดย stachyra ยิ่งไปกว่านั้นสัญชาตญาณของฉันถูกต้องที่ตัดดาดฟ้าจงใจให้ห่างจากกลางก่อนก่อนที่การสับแบบระลอกคลื่นน้อยทำให้เกิดการแพร่กระจายมากขึ้นในสำรับ อย่างไรก็ตามหลังจากประมาณ 5 สับมันไม่ได้มีความสำคัญอีกต่อไปแล้ว คุณจะเห็นว่าหลังจากนั้นประมาณ 6-7 ชัฟเฟิลเอนโทรปีจะถูกขยายให้ใหญ่สุดเทียบกับ 10-12 เพราะข้ออ้างทำให้ stachyra ของฉัน เป็นไปได้หรือไม่ว่า 7 shuffles นั้นเพียงพอหรือฉันตาบอด
คุณสามารถเห็นข้อมูลของฉันที่ Google ชีต เป็นไปได้ว่าฉันบันทึกการ์ดเล่นหรือสองอย่างไม่ถูกต้องดังนั้นฉันจึงไม่สามารถรับประกันความถูกต้องได้ 100% กับข้อมูล
เป็นสิ่งสำคัญที่การค้นพบของคุณจะได้รับการตรวจสอบอย่างอิสระเช่นกัน แบรดแมนน์จากภาควิชาคณิตศาสตร์ของมหาวิทยาลัยฮาร์วาร์ดศึกษาว่าต้องใช้กี่ครั้งในการสับไพ่ก่อนที่ความสามารถในการคาดการณ์ของการ์ดใด ๆ ในสำรับจะไม่สามารถคาดเดาได้อย่างสมบูรณ์ (แชนนอนเอนโทรปีนั้นขยายใหญ่สุด) ผลลัพธ์ของเขาสามารถพบได้ใน PDF 33 หน้านี้
สิ่งที่น่าสนใจจากการค้นพบของเขาคือจริง ๆ แล้วเขากำลังตรวจสอบบทความ 1990 New York Times โดย Persi Diaconisซึ่งอ้างว่า 7 shuffles เพียงพอสำหรับการผสมสำรับไพ่ผ่านการสลับแบบ riffle อย่างละเอียด
แบรดแมนน์เดินผ่านแบบจำลองทางคณิตศาสตร์ที่แตกต่างกันสองสามแบบในการสับรวมทั้งเชนมาร์คอฟและมาถึงข้อสรุปดังต่อไปนี้:
นี่คือประมาณ 11.7 สำหรับ n = 52 ซึ่งหมายความว่าตามมุมมองนี้เราคาดว่าโดยเฉลี่ย 11 หรือ 12 สับจะจำเป็นสำหรับการสุ่มไพ่จริง โปรดทราบว่านี่มีขนาดใหญ่กว่า 7 อย่างมาก
แบรดแมนน์เพิ่งตรวจสอบผลลัพธ์ของ stachyra อย่างอิสระ แต่ไม่ใช่ของฉัน ดังนั้นฉันจึงดูข้อมูลของฉันให้ละเอียดยิ่งขึ้นและฉันค้นพบว่าทำไม 7 ชัฟเฟิลไม่เพียงพอ ก่อนอื่นค่าเอนโทรปีสูงสุดของแชนนอนเป็นบิตสำหรับการ์ดใด ๆ ในสำรับคือ log (52) / log (2) ~ = 5.7 บิต แต่ข้อมูลของฉันไม่แตกเกิน 5 บิต อยากรู้ว่าฉันสร้างอาร์เรย์จำนวน 52 องค์ประกอบใน Python โดยสับอาร์เรย์นั้น:
>>> import random
>>> r = random.SystemRandom()
>>> d = [x for x in xrange(1,52)]
>>> r.shuffle(d)
>>> print d
[20, 51, 42, 44, 16, 5, 18, 27, 8, 24, 23, 13, 6, 22, 19, 45, 40, 30, 10, 15, 25, 37, 52, 34, 12, 46, 48, 3, 26, 4, 1, 38, 32, 14, 43, 7, 31, 50, 47, 41, 29, 36, 39, 49, 28, 21, 2, 33, 35, 9, 17, 11]
การคำนวณเอนโทรปีต่อบัตรให้ผลประมาณ 4.8 บิต การทำเช่นนี้เป็นสิบครั้งหรือมากกว่านั้นจะแสดงผลลัพธ์ที่คล้ายกันซึ่งแตกต่างกันระหว่าง 5.2 บิตและ 4.6 บิตโดยมีค่าเฉลี่ย 4.8 ถึง 4.9 ดังนั้นการดูค่าเอนโทรปีแบบดิบของข้อมูลของฉันไม่เพียงพอมิฉะนั้นฉันสามารถเรียกมันได้ดีที่ 5 shuffles
เมื่อฉันดูข้อมูลของฉันอย่างใกล้ชิดฉันสังเกตเห็นจำนวน "ศูนย์ที่เก็บข้อมูล" เหล่านี้คือที่เก็บซึ่งไม่มีข้อมูลสำหรับการลบระหว่างการ์ดใบหน้าสำหรับหมายเลขนั้น ตัวอย่างเช่นเมื่อลบค่าของไพ่สองใบที่อยู่ติดกันจะไม่มีผลลัพธ์ "15" หลังจากคำนวณเดลตาทั้งหมด 52 รายการ
ฉันเห็นว่าในที่สุดมันก็จะตกลงประมาณ 17-18 "ศูนย์ถัง" ประมาณ 11-12 สับ แน่นอนว่าสำรับที่สับของฉันผ่าน Python เฉลี่ย 17-18 "zero buckets" ด้วยค่าสูง 21 และต่ำจาก 14 ทำไม 17-18 เป็นผลลัพธ์ที่ตัดสินฉันยังอธิบายไม่ได้ ... แต่ดูเหมือนว่าฉันต้องการเอนโทรปีทั้งสอง ~ 4.8 บิตและ 17 "ศูนย์ถัง"
ด้วยการสลับสับเปลี่ยนหุ้นของฉันนั่นคือ 11-12 สับ ด้วยการตัดและสับเปลี่ยนของฉันนั่นคือ 6-7 ดังนั้นเมื่อพูดถึงเกมฉันขอแนะนำให้ใช้แบบตัดและสับ ไม่เพียง แต่รับประกันว่าการ์ดด้านบนและล่างจะถูกผสมลงในสำรับในการสับเปลี่ยนแต่ละครั้ง แต่ก็ยังเร็วกว่า 11-12 ในการสับไพ่ ฉันไม่รู้เกี่ยวกับคุณ แต่เมื่อฉันเล่นเกมไพ่กับครอบครัวและเพื่อน ๆ พวกเขาไม่อดทนพอที่ฉันจะเล่น shuffles 12 อัน