Thuật toán xáo bài của trò chơi FreeCell trên Windows
(solitairelaboratory.com)FreeCell trên Windows, trò mà hẳn nhiều người đã từng chơi, sắp xếp các lá bài theo thứ tự ngẫu nhiên và mỗi cách sắp xếp đều có một số đi kèm. Khi chọn cùng một số, cách sắp xếp bài sẽ giống hệt nhau.
Cho đến trước Windows 2000, trò chơi có các số từ 1 đến 32.000, nhưng từ XP trở đi đã được mở rộng lên đến 1.000.000.
Thuật toán tạo ra cách sắp xếp bài khi nhập số đã được công khai, nên cũng được sử dụng trong các chương trình FreeCell khác.
Thuật toán này được cài đặt bằng mã C ngắn gọn và phụ thuộc vào các hàm rand() và srand() do trình biên dịch của MS cài đặt.
8 bình luận
Anh Tag chơi giỏi thật đấy.
Thuật toán tạo số ngẫu nhiên ban đầu trông có vẻ là
random, nhưng thực ra dùng một công thức truy hồi để tạo ra dãy số giả ngẫu nhiên, tứcpseudo-random number, vốn không thật sự ngẫu nhiên. Mỗi cách hiện thực hàmrand()có thể khác nhau, nhưng gần như mọi thuật toán đều có chung đặc tính là nếuseedban đầu giống nhau thì dãy số ngẫu nhiên sinh ra sau đó cũng sẽ giống hệt nhau. Vì vậy, nếu thuật toán sắp xếp bài là deterministic thì mọi cách sắp xếp bài đều được quyết định một cách deterministic bởiseed.Hơi lạc đề một chút, nhưng việc có thể tạo ra
pseudo-random numbertrông ngẫu nhiên đến mức nào cũng từng là một trong những chủ đề được nghiên cứu từ lâu. TAOCP Vol.2 cũng có đề cập ngắn gọn đến nội dung này.Thực ra trên máy tính không hề có khái niệm ngẫu nhiên thực sự.
Vì vậy thông thường người ta đo hành vi của con người theo đơn vị ms và dùng nó làm seed ngẫu nhiên.
Tôi cứ nghĩ số ngẫu nhiên dùng timestamp của thời gian hiện tại, hóa ra là tôi đã hiểu nhầm rồi haha. Cảm ơn bạn đã chia sẻ.
Khi khởi tạo thì nhiều người thường dùng thời gian làm seed. Vì thời gian luôn liên tục thay đổi mà.
Xin lưu ý, trong phần trợ giúp của Windows có viết rằng: “Dù chưa được chứng minh, nhưng tất cả các ván chơi ở đây đều có lời giải”; tuy nhiên theo nỗ lực thử nghiệm của nhiều người, ván số 11982 đến nay vẫn được biết là không thể thắng.
Ngay cả sau mốc 32.000 cũng có những cách xếp bài được cho là không thể thắng, như các ván số 146692, 186216, 455889, 495505, 512118, 517776 và 781948.
Không biết làm sao họ có thể ghi lại chuyện này mà vẫn không giải được nhỉ? Đúng là có nhiều người cực kỳ lì lợm!
Đúng là những người đáng sợ...!