fixmint
TH

วิธีสุ่มผู้โชคดีกิจกรรมแจกของอย่างยุติธรรมและแสดงที่มาของผล

โดย · · อัปเดตเมื่อ 8 พฤศจิกายน 2026 · อ่าน 4 นาที

การสุ่มผู้โชคดีให้ยุติธรรม ควรใช้ตัวสร้างเลขที่ออกแบบมาเพื่อความปลอดภัย ให้ทุกรายการมีโอกาสเท่ากัน และให้ผู้เข้าร่วมตรวจสอบผลได้ภายหลัง ความไม่เป็นธรรมในตัวสุ่มแบบง่ายส่วนใหญ่มาจากสองจุด คือแหล่งสุ่มที่อ่อนแอ หรือความผิดพลาดทางคณิตศาสตร์เล็กน้อยที่เรียกว่า 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 พันล้านค่า ความเอนเอียงจึงแทบไม่มีผลต่อการสุ่มรางวัล อย่างไรก็ตาม ตัวสุ่มที่ดีควรจัดการเรื่องนี้ไว้ เพราะความผิดพลาดแบบเดียวกันจะแย่ลงเมื่อช่วงของค่าแคบลง

การสุ่มโดยไม่ซ้ำ

หากต้องการผู้โชคดีหลายคน การสุ่มดัชนีแบบสุ่มสามครั้งอาจได้รายการเดิมซ้ำกันได้ มีสองวิธีที่สะอาดที่หลีกเลี่ยงปัญหานี้:

  1. ตัดผู้โชคดีแต่ละคนออกจากรายชื่อ แล้วสุ่มใหม่จากรายการที่เหลือ
  2. สลับลำดับทั้งรายชื่อหนึ่งครั้งด้วยวิธี Fisher–Yates แล้วเลือกผู้โชคดีจากด้านบนสุด

วิธี Fisher–Yates จะไล่รายชื่อจากท้ายไปต้นและสลับตำแหน่งแต่ละตำแหน่งกับตำแหน่งที่สุ่มเลือกได้ซึ่งอยู่ที่ตำแหน่งนั้นหรือก่อนหน้า เมื่อการสุ่มแต่ละครั้งยุติธรรม วิธีนี้จะให้ทุกลำดับความเป็นไปได้มีโอกาสเท่ากัน วิธีนี้สั้น เป็นที่เข้าใจกันดี และอธิบายให้ผู้เข้าร่วมฟังได้ง่าย ตัวเลือก "ตัดผู้ชนะออก" และ "ไม่ซ้ำ" ของตัวสุ่มรองรับทั้งสองวิธี

ทำให้ผลการสุ่มตรวจสอบได้

การสุ่มที่ยุติธรรมคือการสุ่มที่ใครก็ตรวจสอบได้ ก่อนการสุ่ม:

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

ระหว่างและหลังการสุ่ม:

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

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

วิธีทำกับ fixmint

  1. เลือก ชื่อ แล้ววางรายการลงในช่อง ชื่อ บรรทัดละหนึ่งรายการ
  2. ตั้งค่า จำนวนผู้โชคดี ให้ตรงกับจำนวนรางวัล แล้วติ๊ก ตัดผู้ชนะออกจากรายชื่อ เพื่อไม่ให้ใครได้รับรางวัลซ้ำ
  3. สำหรับการสุ่มเลข ให้เลือก ตัวเลข ตั้งค่า ต่ำสุด และ สูงสุด แล้วติ๊ก ไม่ซ้ำ หากแต่ละหมายเลขมีสิทธิ์ถูกรางวัลได้เพียงครั้งเดียว
  4. กด สุ่มผู้โชคดี โดยเปิดการบันทึกหน้าจอไว้ตั้งแต่ต้น
  5. เผยแพร่รายการที่มีหมายเลข ลายนิ้วมือ SHA-256 รายการที่ถูกรางวัล และวิธีที่ใช้ตัวสุ่ม

คำตอบสั้น ๆ

ใช้ Math.random() สุ่มในกิจกรรมแจกของได้ไหม

ใช้ได้กับเกมและการสลับลำดับ แต่ไม่เหมาะกับการสุ่มที่ผู้เข้าร่วมจะตรวจสอบ เพราะผลลัพธ์ของมันคาดเดาได้ ควรใช้แหล่งสุ่มเชิงเข้ารหัส

ทำไมไม่สุ่มเลขแล้วหารเอาเศษด้วยจำนวนรายการเลย

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

สุ่มผู้โชคดีหลายคนจากการสุ่มครั้งเดียวได้ไหม

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

แปลจาก ฉบับภาษาอังกฤษ ด้วยความช่วยเหลือของ AI

ความคิดเห็น

    ยังไม่มีความคิดเห็น มาเป็นคนแรกกันเลย

    คะแนนของคุณ (ไม่บังคับ)

    อีเมลของคุณจะไม่ถูกแสดงหรือเก็บไว้

    ปกของ The Paperoom Game Night KitThe Paperoom Game Night Kit

    ชุดเกมคืนสังสรรค์สำหรับพิมพ์ได้ 52 หน้า ประกอบด้วยบิงโกปาร์ตี้ ปริศนา เกมกระดาน และการต่อสู้ด้วยดินสอและกระดาษ พร้อมแพลนเนอร์และกระดานคะแนน

    $7.00ซื้อบน Gumroadฉบับภาษาอังกฤษ