Tôi biết rằng bài đăng này đã gần 4 năm, nhưng tôi là một nhà phân tích mật mã có sở thích, và đã nghiên cứu về chơi mật mã thẻ . Kết quả là, tôi đã quay lại bài này nhiều lần để giải thích việc xáo trộn bộ bài như là một nguồn entropy cho việc khóa ngẫu nhiên bộ bài. Cuối cùng, tôi quyết định xác minh câu trả lời bằng stachyra bằng cách xáo trộn bộ bài bằng tay và ước tính entropy của bộ bài sau mỗi lần xáo trộn.
TL; DR, để tối đa hóa entropy boong:
- Để chỉ xáo trộn riffle, bạn cần 11-12 lần xáo trộn.
- Để cắt boong trước sau đó xáo trộn xáo trộn, bạn chỉ cần 6-7 lần cắt và xáo trộn.
Trước hết, tất cả mọi thứ mà stachyra đề cập để tính toán entropy của Shannon là chính xác. Nó có thể được đun sôi theo cách này:
- Số lượng gán một giá trị duy nhất cho mỗi trong số 52 thẻ trong bộ bài.
- Xáo trộn bộ bài.
- Với n = 0 đến n = 51, ghi lại từng giá trị của (n - (n + 1) mod 52) mod 52
- Đếm số lần xuất hiện của 0, 1, 2, ..., 49, 50, 51
- Bình thường hóa các hồ sơ bằng cách chia cho 52
- Với i = 1 đến i = 52, hãy tính -p_i * log (p_i) / log (2)
- Tính tổng các giá trị
Trường hợp stachyra đưa ra một giả định tinh tế, đó là việc thực hiện một sự xáo trộn của con người trong một chương trình máy tính sẽ đi kèm với một số hành lý. Với thẻ chơi trên giấy, khi chúng đã quen, dầu từ tay bạn chuyển sang thẻ. Trong một thời gian dài, do sự tích tụ dầu, các thẻ sẽ bắt đầu dính lại với nhau và điều này sẽ kết thúc trong việc xáo trộn của bạn. Bộ bài được sử dụng càng nhiều, càng có nhiều khả năng hai hoặc nhiều thẻ liền kề sẽ dính vào nhau và điều đó sẽ xảy ra thường xuyên hơn.
Hơn nữa, giả sử hai câu lạc bộ và jack của trái tim gắn bó với nhau. Họ có thể sẽ bị mắc kẹt với nhau trong suốt thời gian xáo trộn của bạn, không bao giờ tách rời. Điều này có thể được bắt chước trong một chương trình máy tính, nhưng đây không phải là trường hợp với thói quen R của stachyra.
Ngoài ra, stachyra có một biến thao tác "mixprob". Không hiểu đầy đủ về biến này, nó là một chút của hộp đen. Bạn có thể đặt sai, ảnh hưởng đến kết quả. Vì vậy, tôi muốn chắc chắn rằng trực giác của anh ấy là chính xác. Vì vậy, tôi đã xác minh nó bằng tay.
Tôi xáo trộn bộ bài 20 lần bằng tay, trong hai trường hợp khác nhau (tổng số 40 lần xáo trộn). Trong trường hợp đầu tiên, tôi chỉ xáo trộn xáo trộn, giữ các vết cắt bên phải và bên trái gần với nhau. Trong trường hợp thứ hai, tôi cố tình cắt boong ra khỏi giữa boong (1/3, 2/5, 1/4, v.v.) trước khi thực hiện cắt thậm chí cho shuffle riffle. Cảm giác ruột của tôi trong trường hợp thứ hai là bằng cách cắt boong trước khi xáo trộn, và tránh xa giữa chừng, tôi có thể đưa khuếch tán vào boong nhanh hơn so với xáo trộn cổ phiếu.
Đây là kết quả. Đầu tiên, riffle xáo trộn thẳng:
Và đây là cắt boong kết hợp với xáo trộn riffle:
Có vẻ như entropy được tối đa hóa trong khoảng 1/2 thời gian yêu cầu của stachyra. Hơn nữa, trực giác của tôi là chính xác rằng việc cắt boong cố tình ra khỏi giữa trước, trước khi xáo trộn riffle đã giới thiệu thêm sự khuếch tán vào boong. Tuy nhiên, sau khoảng 5 lần xáo trộn, nó không thực sự quan trọng nữa. Bạn có thể thấy rằng sau khoảng 6-7 lần xáo trộn, entropy được tối đa hóa, so với 10-12 khi yêu cầu thực hiện stachyra của tôi. Có thể là 7 shuffles là đủ, hoặc tôi bị mù?
Bạn có thể xem dữ liệu của tôi tại Google Sheets . Có thể tôi đã ghi lại một hoặc hai thẻ chơi không chính xác, vì vậy tôi không thể đảm bảo chính xác 100% với dữ liệu.
Điều quan trọng là những phát hiện của bạn cũng được xác minh độc lập. Brad Mann, từ Khoa Toán học tại Đại học Harvard, đã nghiên cứu bao nhiêu lần để xáo trộn một cỗ bài trước khi khả năng dự đoán của bất kỳ thẻ nào trong bộ bài là hoàn toàn không thể đoán trước (entropy của Shannon được tối đa hóa). Kết quả của ông có thể được tìm thấy trong bản PDF 33 trang này .
Điều thú vị với phát hiện của anh ta là anh ta thực sự độc lập xác minh một bài báo New York Times năm 1990 của Persi Diaconis , người tuyên bố rằng 7 xáo trộn là đủ để trộn kỹ một cỗ bài chơi thông qua xáo trộn riffle.
Brad Mann đi qua một vài mô hình toán học khác nhau trong xáo trộn, bao gồm chuỗi Markov, và đi đến kết luận sau:
Con số này xấp xỉ 11,7 cho n = 52, điều đó có nghĩa là, theo quan điểm này, chúng tôi hy vọng trung bình 11 hoặc 12 lần xáo trộn là cần thiết để ngẫu nhiên một bộ bài thực sự. Lưu ý rằng điều này là lớn hơn 7.
Brad Mann chỉ xác nhận độc lập kết quả của stachyra chứ không phải của tôi. Vì vậy, tôi đã xem xét kỹ hơn dữ liệu của mình và tôi phát hiện ra tại sao 7 lần xáo trộn là không đủ. Trước hết, entropy tối đa theo lý thuyết Shannon tính theo bit cho bất kỳ thẻ nào trong bộ bài là log (52) / log (2) ~ = 5,7 bit. Nhưng dữ liệu của tôi không bao giờ thực sự phá vỡ nhiều hơn 5 bit. Tò mò, tôi đã tạo ra một mảng gồm 52 phần tử trong Python, xáo trộn mảng đó:
>>> 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]
Tính toán entropy-per-card của nó mang lại khoảng 4,8 bit. Làm điều này hàng chục lần hoặc lâu hơn cho thấy kết quả tương tự khác nhau giữa 5,2 bit và 4,6 bit, với mức trung bình 4,8 đến 4,9. Vì vậy, nhìn vào giá trị entropy thô của dữ liệu của tôi là không đủ, nếu không tôi có thể gọi nó là tốt với 5 lần xáo trộn.
Khi tôi nhìn kỹ hơn vào dữ liệu của mình, tôi nhận thấy số lượng "số không". Đây là các nhóm không có dữ liệu về vùng đồng bằng giữa các mặt thẻ cho số đó. Ví dụ: khi trừ giá trị của hai thẻ liền kề, không có kết quả "15" sau khi tất cả 52 đồng bằng đã được tính toán.
Tôi thấy rằng cuối cùng nó giải quyết khoảng 17-18 "số không" trong khoảng 11-12 lần xáo trộn. Chắc chắn, bộ bài xáo trộn của tôi thông qua Python trung bình 17-18 "số không", với mức cao là 21 và mức thấp là 14. Tại sao 17-18 là kết quả giải quyết, tôi chưa thể giải thích .... Nhưng, có vẻ như tôi muốn cả ~ 4,8 bit entropy VÀ 17 "số không".
Với sự xáo trộn chứng khoán của tôi, đó là 11-12 lần xáo trộn. Với cut-and-shuffle của tôi, đó là 6-7. Vì vậy, khi nói đến các trò chơi, tôi sẽ khuyên bạn nên cắt và xáo trộn. Điều này không chỉ đảm bảo rằng các thẻ trên và dưới được trộn lẫn vào bộ bài trên mỗi lần xáo trộn, nó cũng chỉ đơn giản là nhanh hơn 11-12 lần xáo trộn. Tôi không biết về bạn, nhưng khi tôi chơi các trò chơi bài với gia đình và bạn bè, họ không đủ kiên nhẫn để tôi thực hiện 12 lần xáo trộn.