วิธีสุ่มผู้โชคดีกิจกรรมแจกของอย่างยุติธรรมและแสดงที่มาของผล
การสุ่มผู้โชคดีให้ยุติธรรม ควรใช้ตัวสร้างเลขที่ออกแบบมาเพื่อความปลอดภัย ให้ทุกรายการมีโอกาสเท่ากัน และให้ผู้เข้าร่วมตรวจสอบผลได้ภายหลัง ความไม่เป็นธรรมในตัวสุ่มแบบง่ายส่วนใหญ่มาจากสองจุด คือแหล่งสุ่มที่อ่อนแอ หรือความผิดพลาดทางคณิตศาสตร์เล็กน้อยที่เรียกว่า modulo bias ทั้งสองอย่างแก้ได้ การเผยแพร่รายชื่อผู้เข้าร่วมและบันทึกการสุ่มเป็นหลักฐานที่ดีที่สุดว่าไม่มีใครเลือกผู้โชคดีเอง
เครื่องสุ่มสุ่มผู้โชคดีอย่างยุติธรรมใช้ฟรีเลขสุ่มจริงและเลขสุ่มเทียม
แหล่งสุ่มจริงได้ความคาดเดาไม่ได้จากกระบวนการทางกายภาพ เช่น สัญญาณรบกวนทางไฟฟ้า ส่วนตัวสร้างเลขสุ่มเทียมเป็นเพียงสูตรคำนวณ มันเริ่มจากค่าตั้งต้นหรือ seed แล้วทำขั้นตอนที่กำหนดแน่นอนเพื่อให้ได้ลำดับตัวเลขที่ดูเหมือนสุ่ม ลำดับนี้ถูกกำหนดโดย seed ทั้งหมด ดังนั้นใครก็ตามที่รู้ seed และสูตร สามารถทำนายตัวเลขทุกตัวได้
ซอฟต์แวร์ส่วนใหญ่ใช้ตัวสร้างเลขสุ่มเทียม ซึ่งเพียงพอสำหรับการสลับเพลย์ลิสต์หรือสุ่มด่านในเกม แต่สำหรับการสุ่มที่มีรางวัลให้ลุ้น คำถามคือมีใครคาดเดาหรือควบคุมผลลัพธ์ได้หรือไม่ ตัวสร้างที่เร็วแต่คาดเดาได้จึงไม่เหมาะกับงานนี้
ใช้ตัวสร้างเชิงเข้ารหัสของเบราว์เซอร์
ใน JavaScript Math.random() เป็นตัวสร้างเลขสุ่มเทียมที่เร็ว เอกสารของมันระบุว่าไม่เหมาะกับการเข้ารหัส และการสุ่มรางวัลเป็นเรื่องที่ต้องระวังด้านความปลอดภัย ฟังก์ชัน crypto.getRandomValues() ของ Web Crypto จะเติมค่าลงในอาร์เรย์จากแหล่งสุ่มเชิงเข้ารหัสของระบบปฏิบัติการ นี่คือตัวที่ควรใช้ ตัวสุ่มผู้โชคดี ใช้ฟังก์ชันนี้ในทุกการสุ่ม รวมถึงการโยนเหรียญและทอยลูกเต๋า เครื่องมือที่ไม่บอกว่าใช้อะไรจะเชื่อถือได้ยากกว่า จึงควรถามให้แน่ใจก่อนนำไปใช้
ความเอนเอียงแบบ modulo พร้อมตัวอย่าง
สมมติแหล่งสุ่มให้ไบต์สุ่มมา ซึ่งเป็นจำนวนเต็มตั้งแต่ 0 ถึง 255 และคุณต้องการเลือกหนึ่งในสามรายการ วิธีที่ง่ายที่สุดคือเอาเศษจากการหารด้วย 3 ดูเผิน ๆ เหมือนยุติธรรม แต่ 256 หารด้วยสามลงตัวไม่พอดี
- ค่า 0, 3, 6 ไปจนถึง 255 ให้เศษ 0 มีทั้งหมด 86 ค่า
- ค่าที่ให้เศษ 1 มี 85 ค่า และค่าที่ให้เศษ 2 ก็มี 85 ค่าเช่นกัน
ดังนั้นรายการที่ 0 จะออกมา 86 ครั้งจาก 256 ครั้ง คิดเป็นประมาณ 33.6% ส่วนรายการที่ 1 และ 2 ออกมารายการละ 85 ครั้ง คิดเป็นประมาณ 33.2% ความต่างนี้เล็กน้อย แต่มีอยู่จริง และจะยิ่งมากขึ้นเมื่อจำนวนรายการใหญ่เทียบกับช่วงของแหล่งสุ่ม
วิธีแก้คือการสุ่มแบบปฏิเสธ (rejection sampling) สุ่มค่าหนึ่ง ถ้าค่านั้นอยู่ในส่วนเศษที่ไม่สม่ำเสมอ ให้สุ่มใหม่ สำหรับตัวอย่างไบต์ คุณจะปฏิเสธ 255 และรับเฉพาะ 0 ถึง 254 ซึ่งหารด้วยสามลงตัวพอดี หากใช้เลขสุ่ม 32 บิต ส่วนที่เหลือจะมีประมาณหนึ่งค่าในทุก 4.3 พันล้านค่า ความเอนเอียงจึงแทบไม่มีผลต่อการสุ่มรางวัล อย่างไรก็ตาม ตัวสุ่มที่ดีควรจัดการเรื่องนี้ไว้ เพราะความผิดพลาดแบบเดียวกันจะแย่ลงเมื่อช่วงของค่าแคบลง
การสุ่มโดยไม่ซ้ำ
หากต้องการผู้โชคดีหลายคน การสุ่มดัชนีแบบสุ่มสามครั้งอาจได้รายการเดิมซ้ำกันได้ มีสองวิธีที่สะอาดที่หลีกเลี่ยงปัญหานี้:
- ตัดผู้โชคดีแต่ละคนออกจากรายชื่อ แล้วสุ่มใหม่จากรายการที่เหลือ
- สลับลำดับทั้งรายชื่อหนึ่งครั้งด้วยวิธี Fisher–Yates แล้วเลือกผู้โชคดีจากด้านบนสุด
วิธี Fisher–Yates จะไล่รายชื่อจากท้ายไปต้นและสลับตำแหน่งแต่ละตำแหน่งกับตำแหน่งที่สุ่มเลือกได้ซึ่งอยู่ที่ตำแหน่งนั้นหรือก่อนหน้า เมื่อการสุ่มแต่ละครั้งยุติธรรม วิธีนี้จะให้ทุกลำดับความเป็นไปได้มีโอกาสเท่ากัน วิธีนี้สั้น เป็นที่เข้าใจกันดี และอธิบายให้ผู้เข้าร่วมฟังได้ง่าย ตัวเลือก "ตัดผู้ชนะออก" และ "ไม่ซ้ำ" ของตัวสุ่มรองรับทั้งสองวิธี
ทำให้ผลการสุ่มตรวจสอบได้
การสุ่มที่ยุติธรรมคือการสุ่มที่ใครก็ตรวจสอบได้ ก่อนการสุ่ม:
- เผยแพร่รายชื่อผู้เข้าร่วมเป็นรายการลำดับเลข พร้อมกติกาว่าใครมีสิทธิ์บ้าง
- เผยแพร่ลายนิ้วมือ SHA-256 ของรายชื่อนั้น เครื่องมือ SHA-256 ใดก็สร้างได้ เช่น เครื่องมือสร้างแฮช ลายนิ้วมือจะเปลี่ยนไปทั้งหมดหากมีรายการใดเปลี่ยนแม้เพียงรายการเดียว ทำให้รายชื่อไม่สามารถแก้ไขโดยไม่มีใครรู้ได้ การตรวจสอบแบบเดียวกันนี้ใช้กับการดาวน์โหลดได้ด้วย ดูวิธีตรวจสอบค่าแช็ก SHA-256 ของไฟล์ดาวน์โหลด เพื่อดูขั้นตอน
ระหว่างและหลังการสุ่ม:
- บันทึกหน้าจอตั้งแต่เริ่มใช้ตัวสุ่มจนถึงผลที่แสดง
- เผยแพร่รายชื่อสุดท้ายพร้อมหมายเลขที่ถูกรางวัล เพื่อให้ทุกคนคำนวณลายนิ้วมือใหม่และยืนยันได้ว่าไม่มีอะไรเปลี่ยนไป
- บอกว่าผู้โชคดีถูกเลือกอย่างไร เช่น "เลือกด้วยตัวสุ่มบนเบราว์เซอร์ที่ใช้แหล่งสุ่มเชิงเข้ารหัสของระบบปฏิบัติการ"
กติกาการแจกของแต่ละแพลตฟอร์มไม่เหมือนกัน และการจับฉลากรางวัลอาจมีข้อกำหนดทางกฎหมายที่ขึ้นอยู่กับที่อยู่ของคุณ ก่อนจัดกิจกรรม โปรดตรวจสอบกติกาการส่งเสริมการขายของแพลตฟอร์มและกฎหมายท้องถิ่นของคุณ นี่เป็นคำแนะนำทั่วไป ไม่ใช่คำปรึกษาทางกฎหมาย เมื่อพร้อมแล้ว สุ่มผู้โชคดีด้วยตัวสุ่มผู้โชคดี
วิธีทำกับ fixmint
- เลือก ชื่อ แล้ววางรายการลงในช่อง ชื่อ บรรทัดละหนึ่งรายการ
- ตั้งค่า จำนวนผู้โชคดี ให้ตรงกับจำนวนรางวัล แล้วติ๊ก ตัดผู้ชนะออกจากรายชื่อ เพื่อไม่ให้ใครได้รับรางวัลซ้ำ
- สำหรับการสุ่มเลข ให้เลือก ตัวเลข ตั้งค่า ต่ำสุด และ สูงสุด แล้วติ๊ก ไม่ซ้ำ หากแต่ละหมายเลขมีสิทธิ์ถูกรางวัลได้เพียงครั้งเดียว
- กด สุ่มผู้โชคดี โดยเปิดการบันทึกหน้าจอไว้ตั้งแต่ต้น
- เผยแพร่รายการที่มีหมายเลข ลายนิ้วมือ SHA-256 รายการที่ถูกรางวัล และวิธีที่ใช้ตัวสุ่ม
คำตอบสั้น ๆ
ใช้ Math.random() สุ่มในกิจกรรมแจกของได้ไหม
ใช้ได้กับเกมและการสลับลำดับ แต่ไม่เหมาะกับการสุ่มที่ผู้เข้าร่วมจะตรวจสอบ เพราะผลลัพธ์ของมันคาดเดาได้ ควรใช้แหล่งสุ่มเชิงเข้ารหัส
ทำไมไม่สุ่มเลขแล้วหารเอาเศษด้วยจำนวนรายการเลย
เมื่อช่วงของค่าหารด้วยจำนวนรายการไม่ลงตัว เศษที่ได้จะไม่สม่ำเสมอ ทำให้บางรายการมีโอกาสมากกว่าเล็กน้อย การสุ่มแบบปฏิเสธจะกำจัดความเอนเอียงนี้ได้
สุ่มผู้โชคดีหลายคนจากการสุ่มครั้งเดียวได้ไหม
ได้ ตัดผู้โชคดีแต่ละคนออกก่อนสุ่มครั้งถัดไป หรือสลับรายชื่อหนึ่งครั้งแล้วเลือกรายการด้านบนสุด ไม่ว่าวิธีใด จะไม่มีรายการใดถูกรางวัลซ้ำ
แปลจาก ฉบับภาษาอังกฤษ ด้วยความช่วยเหลือของ AI
ความคิดเห็น
ยังไม่มีความคิดเห็น มาเป็นคนแรกกันเลย


