วิธีการระบุการสร้างแบบสุ่มในความท้าทาย


16

หมายเหตุ : เป็นต่อฉันทามติเกี่ยวกับ Meta , คำถามอยู่ในหัวข้อที่นี่

ด้วยเหตุนี้ "สิ่งที่ต้องหลีกเลี่ยงเมื่อเขียนความท้าทาย"ฉันเริ่มคิดถึงความท้าทายที่เกี่ยวข้องกับการสร้างวัตถุบางประเภทแบบสุ่ม

บางครั้งมันเกิดขึ้นที่ฉันต้องการโพสต์ความท้าทายที่เกี่ยวข้องกับการสุ่มสร้าง foo ที่

  1. มันง่ายมากที่จะตรวจสอบว่าสิ่งที่ให้มาเป็นของปลอมหรือไม่และ
  2. มันเป็นเรื่องยากขึ้นเล็กน้อยที่จะสร้าง "สุ่มคุณภาพดี" อย่างรวดเร็ว

ตัวอย่างเช่น foo อาจเป็นเมทริกซ์ไบนารีที่ไม่มีเซ็กเมนต์ของ 4 บิตเท่ากันในทุกทิศทาง มันง่ายที่จะตรวจสอบว่าไบนารีเมทริกซ์ที่กำหนดนั้นเป็น foo หรือไม่ แต่การสร้าง foo แบบสุ่มที่มีการแพร่กระจายอย่างสวยงามดูเหมือนว่าจะต้องใช้อัลกอริทึมย้อนรอยหรือสิ่งที่คล้ายกัน

อย่างไรก็ตามตอนนี้ฉันจะต้องระบุสิ่งที่มีคุณสมบัติเป็นการสุ่มสุ่มและฉันอยากให้มัน "คาดเดาไม่ได้" ในแง่ที่เป็นสัญชาตญาณว่าเมื่อฉันรันโปรแกรมหลายครั้งผลลัพธ์จะดูแตกต่างกันเสมอ วิธีการที่เข้มงวดที่สุดคือต้องการให้ผลลัพธ์เป็นแบบสุ่ม: foos ที่ใช้ได้ทั้งหมดมีความน่าจะเป็นแบบเดียวกัน โดยทั่วไปจะมีข้อ จำกัด มากเกินไปเนื่องจากฉันไม่รู้ว่าจะทำอย่างไรเพื่อประหยัดสำหรับการสร้าง foos ที่ใช้ได้ทั้งหมดการลบรายการที่ซ้ำกันและเลือกรายการที่น่าเบื่อและช้า

แนวคิดต่อไปของฉันคือการกำหนดให้ foos ที่ใช้ได้ทั้งหมดมีโอกาสสร้างบวก อย่างไรก็ตามนี่หมายความว่าวิธีการดังต่อไปนี้ถูกต้อง: สร้างสิ่งที่เหมือนฟูสุ่ม (ในตัวอย่างของเราเมทริกซ์ฐานสองแบบสุ่ม) ถ้ามันเป็นฟูแล้วส่งคืนมิฉะนั้นคืนค่าฮาร์ดโค้ด (พูดว่าเมทริกซ์เอกลักษณ์ ) สิ่งนี้ยังค่อนข้างน่าเบื่อเนื่องจากโดยทั่วไปแล้วมันเป็นเพียงเครื่องมือจดจำที่ติดไว้กับเครื่องกำเนิดไฟฟ้าแบบสุ่ม

มีคำจำกัดความทั่วไปที่ดีสำหรับการสุ่มสุ่มที่ไม่คาดคิดหรือไม่?

TL; DR

มีวิธีที่ดีในการระบุวัตถุที่สร้างขึ้นแบบ "คาดเดาไม่ได้" ที่ไม่สามารถแก้ไขการกระจาย แต่ไม่สนับสนุนการเข้ารหัสอย่างหนักหรือไม่?


เรามีคำจำกัดความมาตรฐานสำหรับการสุ่มบนเมตาที่จะห้ามการเข้ารหัสอย่างหนัก แต่ไม่ จำกัด เฉพาะเท่าที่สมบูรณ์แบบ
Geobits

5
เป็นคำถามที่ดีมาก ฉันพบว่าการระบุแบบแผนเป็นเรื่องยากในอดีต โดยเฉพาะอย่างยิ่งสำหรับสถานการณ์ที่คุณอธิบายนอกจากนี้ยังมีปัญหาที่คุณสามารถสร้างผู้สมัครแบบสุ่มและทำซ้ำหากพวกเขาไม่ถูกต้อง นั่นยังช่วยให้คุณมีการกระจายที่สม่ำเสมอ แต่ไม่มีการกำหนดรันไทม์ เมื่อระบุการกระจายเครื่องแบบยังมีปัญหาที่ทางออกที่แท้จริงไม่เหมือนกันอย่างสมบูรณ์ นี่เป็นปัญหาที่ละเอียดอ่อนมาก +1
Martin Ender

@MartinEnder ใช่ฉันลืมวิธีการนั้น ฉันสามารถไม่อนุญาตและอัลกอริทึมช้าอื่น ๆ ที่มีขอบเขตเวลา แต่พวกเขายังคงอนุญาตให้ "ทางออกหนึ่งฮาร์ดโค้ด"
Zgarb

ดูเหมือนว่าคุณสามารถระบุ K3 / K4 CPRNG ภาษาส่วนใหญ่จะมีห้องสมุดen.wikipedia.org/wiki/Pseudorandom_number_generator
Ewan

1
@Zgarb เป็นปัญหาใหญ่ที่ไม่อนุญาต "Generate and redo" นั่นคือไลบรารี RNG ส่วนใหญ่ของภาษาทำเช่นนั้น
Nathan Merrill

คำตอบ:


5

ส่งคืนค่า foos ที่ต่างกัน

สิ่งนี้ทำให้เป็นไปไม่ได้ที่จะคืนค่าฮาร์ดโค้ดและมีสนามกอล์ฟที่เหมาะสมครึ่งหนึ่ง อย่างไรก็ตามเครื่องกำเนิดไฟฟ้าที่ถูกต้องตามกฎหมายจะมีโอกาสเล็กน้อยในการแสดงผลฟูซ้ำ ๆ หากต้องการลบภาระของการตรวจสอบสามารถระบุอัตราความล้มเหลวที่ผ่านการทดสอบเชิงประจักษ์ได้ว่า 10% เป็นที่ยอมรับได้

ระวังเรื่องวันเกิดที่ขัดแย้งกันซึ่งความน่าจะเป็นที่ซ้ำซ้อนอาจสูงกว่าที่คุณคิด หากมีเพียง f ล้านที่เป็นไปได้ foos สุ่มหนึ่งพันจะมีความน่าจะเป็นที่ประมาณ 0.6 ที่มีการซ้ำซ้อนในที่นั้นและที่สมมติว่าการสร้าง foo นั้นเหมือนกันทั้งหมด หากนี่อาจเป็นปัญหาต้องบอกว่ามีสิ่งที่ไม่ซ้ำกันถึง 900 รายการสำหรับทุก ๆ 1,000 ที่สร้างขึ้นซึ่งมีความเอื้อเฟื้อเผื่อแผ่มากขึ้นสำหรับตัวกำเนิดฟูของแท้ แต่ก็ยังไม่สามารถทำการเข้ารหัสได้

นอกจากนี้ยังช่วยให้คุณสามารถสร้างสิ่งที่เหมือนฟู ๆ และตรวจสอบ fooness ซ้ำ ๆ จนกว่าคุณจะได้รับ foos ฉันคิดว่านี่เป็นทางออกที่ถูกต้อง แต่ถ้าคุณไม่ชอบ:

ทำได้อย่างรวดเร็ว

โอกาสของสิ่งที่เหมือนฟูสุ่มอย่างสมบูรณ์อาจจะค่อนข้างต่ำดังนั้นการระบุเวลาจึงมีแนวโน้มที่จะบังคับใช้ความพยายามอย่างแท้จริงในการสร้างฟู

เพื่อรองรับความแตกต่างที่ความเร็วระหว่างภาษาที่แตกต่างกันคุณอาจต้องการที่จะมีการ จำกัด เวลาที่แตกต่างกันขึ้นอยู่กับภาษาเช่น Hackerrank: https://www.hackerrank.com/environment อย่างไรก็ตามถ้าคุณระบุขนาดใหญ่พอ foos ความน่าจะเป็นของสิ่งที่เหมือนฟูสุ่มเป็น foo อาจต่ำจริง ๆ ดังนั้นกฎ "ก่อนที่ความตายอันร้อนแรงของจักรวาล" อาจจะเพียงพอ


ฉันคิดว่าคุณกำลังเข้าสู่บางสิ่งที่นี่ "การรันโปรแกรม N ครั้งจะไม่มีการซ้ำซ้อนอย่างน้อย 90% ของเวลา" เป็นรูปธรรมและง่ายต่อการทดสอบและสามารถใช้ร่วมกับเวลาที่กำหนดเพื่อป้องกันการบังคับเดรัจฉานและการสุ่มตัวอย่างการปฏิเสธอย่างง่ายเกินไป
Zgarb

2

ฉันไม่ได้อ้างว่ามีทางออกที่ดีที่สุดสำหรับปัญหา (หรือว่ารายการนี้หมดจด) แต่ฉันต้องการร่างแนวทางที่เป็นไปได้บางอย่างที่อยู่ในใจและทำไมพวกเขาถึงไม่ยอมทำงาน ฉันจะไม่แก้ไขปัญหาเกี่ยวกับการสัมผัสเช่นว่าการใช้การประทับเวลาปัจจุบันเป็นแหล่งที่มาของการสุ่มนั้นเพียงพอ "คาดเดาไม่ได้" และวิธีการบังคับใช้คุณสมบัติบางอย่างของการแจกแจงความน่าจะเป็น - ฉันจะมุ่งเน้นไปที่

ไม่ใช่วิธีการแก้ไข: ไม่อนุญาตให้เข้ารหัสอย่างหนัก

นี่เป็นความคิดที่ไม่ดี มันเป็นข้อกำหนดที่ไม่สามารถสังเกตได้ (ซึ่งหมายความว่าคุณไม่สามารถระบุได้ว่าเป็นที่พอใจเพียงแค่เรียกใช้โปรแกรม) ซึ่งเป็นการลดทอนอย่างมากใน PPCGและอาจเป็นไปไม่ได้เลยหากใช้โปรแกรมบนแพลตฟอร์มอื่น ๆ อย่างอัตโนมัติ ปัญหาเกี่ยวกับข้อกำหนดเช่นนี้คือคุณต้องเริ่มต้นด้วยการค้นหาคำจำกัดความที่มีวัตถุประสงค์สำหรับ "การเข้ารหัสแบบยาก" โดยทั่วไปถ้าคุณลองสิ่งนี้คุณจะทำสิ่งที่แย่กว่านั้นเท่านั้น

ทำให้การเข้ารหัสเป็นไปไม่ได้

หากคุณไม่สามารถยกเลิกการอนุญาตได้อย่างสมบูรณ์ แต่คุณไม่ต้องการให้คนอื่นใช้มันคุณสามารถลองออกแบบความท้าทายที่การเข้ารหัสฮาร์ดไดรฟ์ไม่ใช่วิธีการแข่งขัน สิ่งนี้อาจเกิดขึ้นได้หากวัตถุที่ควรสร้างมีขนาดใหญ่พอและไม่สามารถบีบอัดได้ซึ่งการวางตัวอย่างหนึ่งลงในโค้ดจะต้องใช้จำนวนไบต์มากกว่าการเขียนอัลกอริทึมที่สร้างวิธีแก้ปัญหาที่ถูกต้องแบบสุ่ม ในตัวอย่างเฉพาะของคุณนั่นไม่ใช่กรณีของหลักสูตรเนื่องจากเมทริกซ์การระบุตัวตนนั้นถูกต้องและโดยทั่วไปจะสร้างได้ง่าย แต่สำหรับปัญหาอื่น ๆ นั่นอาจไม่ใช่กรณี หากวัตถุเป้าหมายมีความผิดปกติเพียงพอเพียงแค่ให้วัตถุเหล่านั้นมีขนาดใหญ่ซึ่งอาจไม่ส่งผลกระทบต่อจำนวนไบต์ของอัลกอริทึมจริง แต่จะระเบิดส่วนที่มีการเข้ารหัส

พารามิเตอร์เอาท์พุท

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

ใส่บางข้อ จำกัด เกี่ยวกับการกระจายความน่าจะเป็น

หากคุณยินดีที่จะให้การแจกแจงความน่าจะเป็นแบบไม่ จำกัดอย่างสมบูรณ์คุณสามารถวางข้อ จำกัด บางอย่างไว้ซึ่งยังคงให้อิสระแก่ผู้ตอบในการเลือกการกระจายของพวกเขา แต่สิ่งที่ทำให้การเข้ารหัสยากหรือเป็นไปไม่ได้:

  • ข้อ จำกัด ที่ง่ายที่สุดที่อยู่ในใจคือต้องการความแตกต่างระหว่างความน่าจะเป็นต่ำสุดและสูงสุดสำหรับผลลัพธ์ที่เป็นไปได้ใด ๆ ที่จะต่ำกว่าเกณฑ์ที่กำหนด วิธีการกำหนดค่าตายตัวอาจมีความน่าจะเป็นเกือบเป็นศูนย์สำหรับเกือบทุกเอาต์พุตและความน่าจะเป็นใกล้เคียงกับ 1 สำหรับค่าเริ่มต้น หากคุณต้องการความแตกต่างสูงสุดที่จะต่ำกว่า 0.1 พูดจะต้องมีค่าเริ่มต้น 10 (เลือกแบบสุ่ม) เพื่อให้ตัวเลือกวิธีการ ในทำนองเดียวกันคุณอาจต้องการความน่าจะเป็นขั้นต่ำสำหรับแต่ละเอาต์พุตที่เป็นไปได้เช่น 1 / (2 * N *) โดยที่Nคือจำนวนเอาต์พุตที่เป็นไปได้
  • หรือคุณสามารถกำหนดว่าจะไม่มี (โอกาส) ช่องว่างในการจัดจำหน่ายเพื่อให้มีช่วงเวลาที่มีขนาดไม่δ (ที่คุณเลือก) เช่นว่าทั้งสองน่าจะสูงขึ้นและลดอยู่ ซึ่งหมายความว่าจะไม่มีค่าผิดปกติใด ๆ ในแง่ของโอกาสซึ่งเกิดจากวิธีการเข้ารหัสที่ยาก

ปัญหาหลักของวิธีการเหล่านี้คือการให้เหตุผลที่ยากกว่าการพิสูจน์ความถูกต้องของคำตอบนั้นยากและการตรวจสอบความถูกต้องของการทดลองนั้นเป็นไปไม่ได้สำหรับพื้นที่ส่งออกขนาดใหญ่ ถึงกระนั้นพวกเขายังให้ความต้องการที่สังเกตเห็นได้โดยหลัก ๆ สำหรับโปรแกรมที่สามารถทำให้ฮาร์ดโค้ดไม่สามารถทำได้

วิธีการเหล่านี้อาจต้องมีการ จำกัด เวลาเนื่องจากวิธีหนึ่งในการเพิ่มความน่าจะเป็นของค่าที่ไม่ใช่ค่าเริ่มต้นคือพยายามค้นหา foo แบบสุ่มหลาย ๆ ครั้งก่อนที่จะกลับไปที่ค่าเริ่มต้น

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