เป้าหมายของปริศนานี้คือการสำรับไพ่ 52 ใบและสับไพ่เพื่อให้ไพ่แต่ละใบอยู่ในตำแหน่งสุ่ม
ได้รับ:
- อาเรย์
deck, ของจำนวนเต็ม 52 ที่แตกต่างกันที่เป็นตัวแทนของการ์ด เมื่อคุณเริ่มต้นให้deckประกอบด้วยหนึ่งในบัตรแต่ละใบในลำดับที่ไม่รู้จักบางอย่าง - ฟังก์ชั่น
int rand(min, max)ที่จะส่งกลับจำนวนเต็มแบบสุ่มระหว่าง intsminและmaxรวม คุณสามารถสันนิษฐานได้ว่าฟังก์ชั่นนี้สุ่มอย่างแท้จริง - ฟังก์ชั่น
void swap(x, y)ที่แลกเปลี่ยนไพ่สองใบในสำรับ หากคุณโทรหาswap(x, y)การ์ดที่ตำแหน่งxและyจะเปลี่ยนสถานที่
เมื่อไหร่:
- การเรียกโปรแกรม
shuffle()(หรือshuffle(deck)หรือdeck.shuffle()หรือการนำไปใช้ของคุณชอบที่จะทำงาน),
แล้ว:
deckควรมีหนึ่งบัตรแต่ละใบตามลำดับการสุ่มอย่างสมบูรณ์
จับ:
คุณไม่สามารถประกาศตัวแปรใด ๆ โทรswapและrandมากเท่าที่คุณต้องการ แต่คุณไม่สามารถประกาศตัวแปรใด ๆ ของคุณเอง ซึ่งรวมถึงforเคาน์เตอร์ห่วง - foreachแม้คนโดยปริยายเช่นเดียวกับใน
ชี้แจง:
- คุณสามารถเปลี่ยนรายละเอียดเล็กน้อยเพื่อให้เหมาะกับภาษาที่คุณเลือก ตัวอย่างเช่นคุณสามารถเขียน
swapเพื่อสลับจำนวนเต็มสองจำนวนโดยการอ้างอิง การเปลี่ยนแปลงควรจะทำให้งานของคุณเป็นภาษาของคุณไม่ใช่เพื่อให้ไขปริศนาง่ายขึ้น deckสามารถเป็นตัวแปรทั่วโลกหรือคุณสามารถใช้เป็นพารามิเตอร์- คุณสามารถทำสิ่งที่คุณต้องการเนื้อหาของ
deckแต่คุณไม่สามารถเปลี่ยนความยาวได้ - บัตรของคุณสามารถมีหมายเลข 0-51, 1-52 หรืออะไรก็ได้ที่คุณต้องการ
- คุณสามารถเขียนสิ่งนี้ในภาษาใดก็ได้ แต่ไม่มีการโกงด้วย
shuffleฟังก์ชั่นในตัวของภาษาของคุณ - ใช่คุณสามารถเขียนบรรทัดเดียวกัน 52 ครั้ง ไม่มีใครจะประทับใจ
- เวลาในการดำเนินการไม่สำคัญ แต่จะมีการสุ่มที่แท้จริง
- นี่ไม่ใช่การเข้ารหัสกอล์ฟ แต่คุณสามารถย่อ / ทำให้งงงวยรหัสของคุณได้
แก้ไข: รหัสหม้อไอน้ำและ Visualizer
หากคุณใช้. NET หรือ JavaScript นี่คือรหัสทดสอบบางส่วนที่คุณอาจพบว่ามีประโยชน์:
JavaScript:
- visualizer ของ JavaScript ที่รวดเร็วและสกปรกพร้อมด้วยแหล่งที่มาของ CoffeeScript: https://gist.github.com/JustinMorgan/3989752bdfd579291cca
- เวอร์ชันที่รันได้ (เพียงวางใน
shuffle()ฟังก์ชั่นของคุณ): http://jsfiddle.net/4zxjmy42/
ค#:
- ASP.NET visualizer พร้อม C # codebehind: https://gist.github.com/JustinMorgan/4b630446a43f28eb5559
- ต้นขั้วเพียง
swapและrandอรรถประโยชน์ : https://gist.github.com/JustinMorgan/3bb4e6b058d70cc07d41
รหัสนี้จัดเรียงและสับไพ่หลายพันครั้งและทำการทดสอบสติพื้นฐาน: สำหรับการสุ่มแต่ละครั้งจะตรวจสอบว่ามีไพ่ 52 ใบในสำรับโดยไม่มีการทำซ้ำ จากนั้น Visualizer จะแปลงความถี่ของการ์ดแต่ละใบที่สิ้นสุดในแต่ละสถานที่บนดาดฟ้าโดยแสดงแผนที่ความร้อนระดับสีเทา
เอาต์พุตของ visualizer ควรมีลักษณะเหมือนหิมะที่ไม่มีลวดลายชัดเจน เห็นได้ชัดว่ามันไม่สามารถพิสูจน์การสุ่มอย่างแท้จริง แต่เป็นวิธีที่รวดเร็วและง่ายดายในการตรวจสอบสปอต ฉันแนะนำให้ใช้มันหรืออะไรทำนองนี้เพราะความผิดพลาดบางอย่างในอัลกอริธึมการสับเปลี่ยนทำให้เกิดรูปแบบที่เป็นที่รู้จักมากในผลลัพธ์ ต่อไปนี้เป็นตัวอย่างของเอาต์พุตจากการปรับใช้สองแบบโดยส่วนที่มีข้อบกพร่องทั่วไป:

รุ่นที่มีข้อบกพร่องจะสับเปลี่ยนสำรับได้บางส่วนดังนั้นอาจดูดีถ้าคุณตรวจสอบอาร์เรย์ด้วยมือ เครื่องมือสร้างภาพช่วยให้สังเกตรูปแบบได้ง่ายขึ้น
deckตัวเอง
swapคุณต้องการตราบใดที่มันตอบสนองวัตถุประสงค์พื้นฐานของมัน ส่วนหนึ่งของเหตุผลของฉันในการswapรับมอบคือเพื่อให้ผู้คนสามารถปฏิบัติต่อมันเป็น 'เวทมนตร์' และมุ่งเน้นไปที่ปัญหาหลักโดยไม่ต้องกังวลว่ามันจะทำงานในภาษาที่พวกเขาเลือก คุณสามารถทำได้หรือเขียนเองswapก็ขึ้นอยู่กับคุณ