เครื่องมือสุ่มตัวเลขคืออะไร?
เครื่องมือสุ่มตัวเลข (RNG) คือระบบที่สร้างตัวเลขแบบสุ่มหรือตัวเลขสุ่มเทียมขึ้นมา ตัวเลขถัดไปจะสามารถคาดเดาได้หรือไม่นั้นขึ้นอยู่กับประเภทของเครื่องมือสุ่ม เครื่องมือบางชนิดใช้กระบวนการทางกายภาพ บางชนิดคำนวณตัวเลขด้วยอัลกอริทึม และอัลกอริทึมบางตัวถูกสร้างขึ้นมาเพื่อให้แม้แต่ผู้ที่เห็นผลลัพธ์ก่อนหน้าก็ไม่สามารถคาดเดาตัวเลขถัดไปได้ การดูเหมือนสุ่มกับการคาดเดาไม่ได้เป็นคุณสมบัติที่แตกต่างกัน และเนื้อหาส่วนใหญ่ของบทความนี้จะอธิบายถึงความแตกต่างดังกล่าว
เครื่องมือสุ่มตัวเลขแบบฮาร์ดแวร์
เครื่องมือสุ่มตัวเลขแบบฮาร์ดแวร์ (HRNG) ซึ่งเรียกอีกอย่างว่าเครื่องมือสุ่มตัวเลขแท้จริง (TRNG) ได้รับตัวเลขมาจากกระบวนการทางกายภาพ เครื่องมือที่เก่าแก่ที่สุดทำงานอยู่ต่อหน้าเรา: การโยนเหรียญ การทอยลูกเต๋า หรือวงล้อรูเล็ตต์ กฎกลศาสตร์สามารถอธิบายแต่ละสิ่งได้อย่างสมบูรณ์ แต่วงล้อที่สร้างขึ้นมาอย่างดียังคงคาดเดาไม่ได้ในทางปฏิบัติ เนื่องจากความแตกต่างเพียงเล็กน้อยของจุดเริ่มต้นในการหมุนแต่ละครั้งจะส่งผลลัพธ์ที่แตกต่างกันอย่างสิ้นเชิง
ในทางกลับกัน เครื่องมือสร้างระดับฮาร์ดแวร์สมัยใหม่จะวัดปรากฏการณ์ระดับจุลภาค: สัญญาณรบกวนช็อตและสัญญาณรบกวนจากความร้อนในวงจรอิเล็กทรอนิกส์ สัญญาณรบกวนในชั้นบรรยากาศ หรือปรากฏการณ์ควอนตัม สิ่งเหล่านี้เป็นแหล่งเอนโทรปีที่ดี — ซึ่งคือความไม่แน่นอนที่สามารถวัดได้ — แต่แหล่งกำเนิดทางกายภาพไม่ได้สมบูรณ์แบบโดยธรรมชาติ: อาจมีโอกาสที่ไม่เท่ากัน คลาดเคลื่อน หรือล้มเหลวได้ ดังนั้นคุณภาพจึงต้องได้รับการประเมินและตรวจสอบอย่างสม่ำเสมอ และนำผลลัพธ์ไปประมวลผลเพิ่มเติมเมื่อจำเป็น ดังที่ระบุไว้ในมาตรฐานเช่น NIST SP 800-90B แหล่งกำเนิดทางกายภาพจะถูกนำมาใช้ในจุดที่ความปลอดภัยมีความสำคัญสูงสุด — โดยเฉพาะอย่างยิ่งในวิทยาการเข้ารหัสลับ ซึ่งให้วัตถุดิบเริ่มต้นที่คาดเดาไม่ได้สำหรับกุญแจของโปรโตคอล เช่น Transport Layer Security (TLS)
เครื่องมือสุ่มตัวเลขเทียม
ทางเลือกอื่นนอกเหนือจากอุปกรณ์ทางกายภาพคือการใช้อัลกอริทึม เครื่องมือสุ่มตัวเลขเทียม (PRNG) จะสร้างลำดับตัวเลขที่ดูเหมือนสุ่ม แต่ถูกกำหนดขึ้นอย่างสมบูรณ์โดยค่าเริ่มต้นที่เรียกว่าค่าตั้งต้น (seed) หากป้อนค่าตั้งต้นเดิมให้กับอัลกอริทึมเดิม คุณจะได้ลำดับตัวเลขเดิมทุกครั้ง นี่คือจุดอ่อนเมื่อต้องการผลลัพธ์ที่คาดเดาไม่ได้และค่าตั้งต้นหรือสถานะภายในสามารถถูกคาดเดาหรือสร้างขึ้นใหม่ได้ แต่ก็เป็นจุดแข็งเมื่อต้องการผลลัพธ์ที่สามารถทำซ้ำได้ — เช่น การจำลองสถานการณ์หรือการทดสอบที่สามารถรันซ้ำได้อย่างแม่นยำ PRNG ยังทำงานได้รวดเร็ว ประหยัด และใช้งานง่าย ซอฟต์แวร์ส่วนใหญ่จึงพึ่งพาเครื่องมือเหล่านี้ อัลกอริทึมที่เป็นที่รู้จักกันดี ได้แก่ Linear Congruential Generator (LCG), xorshift และ Mersenne Twister
Mersenne Twister
Mersenne Twister ซึ่งเผยแพร่ในปี 1997 โดย Makoto Matsumoto และ Takuji Nishimura เป็นหนึ่งในเครื่องมือสุ่มตัวเลขเทียมที่ถูกใช้งานอย่างแพร่หลายที่สุด และเป็นค่าเริ่มต้นในภาษาโปรแกรมมากมาย ชื่อของมันมาจากคาบเวลา — ซึ่งคือความยาวของลำดับก่อนที่จะเริ่มวนซ้ำ — โดยในรุ่นมาตรฐาน MT19937 จะเท่ากับจำนวนเฉพาะแมร์แซน 219937 − 1 มันผ่านการทดสอบทางสถิติส่วนใหญ่และเหมาะสำหรับการจำลองสถานการณ์เป็นอย่างดี อย่างไรก็ตาม มันไม่ได้ถูกออกแบบมาเพื่อเก็บรักษาความลับ: จากผลลัพธ์ขนาด 32 บิตติดต่อกัน 624 ค่า ใครก็ตามก็สามารถสร้างสถานะภายในขึ้นมาใหม่และคาดเดาค่าถัดไปได้ทั้งหมด ดังนั้นจึงห้ามนำไปใช้สร้างคีย์ รหัสผ่าน หรือสิ่งอื่นใดที่ต้องคาดเดาไม่ได้
เครื่องมือสุ่มที่ปลอดภัยทางวิทยาการเข้ารหัสลับและเอนโทรปี
การใช้งานจำนวนมากต้องการทั้งสองอย่างพร้อมกัน: ความเร็วของอัลกอริทึมและความคาดเดาไม่ได้ของแหล่งกำเนิดทางกายภาพ คำตอบคือเครื่องมือสุ่มตัวเลขเทียมที่ปลอดภัยทางวิทยาการเข้ารหัสลับ (CSPRNG) ซึ่งยังคงเป็น PRNG ชนิดหนึ่ง แต่ถูกสร้างขึ้นเพื่อให้การเห็นผลลัพธ์บางส่วนไม่สามารถนำไปคาดเดาส่วนที่เหลือในทางปฏิบัติได้ และได้รับการกำหนดค่าตั้งต้นรวมถึงสร้างค่าใหม่อย่างสม่ำเสมอจากแหล่งเอนโทรปีที่แท้จริง ค่าตั้งต้นจากแหล่งทางกายภาพเพียงอย่างเดียวไม่ได้ทำให้ PRNG ทั่วไปมีความปลอดภัย อัลกอริทึมจะต้องถูกออกแบบมาเพื่อสิ่งนี้โดยเฉพาะ แหล่งทางกายภาพ เช่น สัญญาณรบกวนจากความร้อนหรือจังหวะเวลาของฮาร์ดแวร์จะส่งมอบความสุ่มที่แท้จริงในปริมาณเล็กน้อย และ CSPRNG จะได้ลำดับค่ายาวๆ จากมันด้วยความเร็วที่สูงกว่ามาก การผสมผสานนี้คือสิ่งที่ระบบปฏิบัติการมอบให้กับโปรแกรมที่ทำงานอยู่ และเป็นสิ่งที่คำว่า "เครื่องมือสุ่มตัวเลข" มักหมายถึงในทางปฏิบัติปัจจุบัน มันใช้สร้างคีย์เข้ารหัสลับ โทเค็นเซสชัน และรหัสผ่าน
การสุ่มตัวเลขในเบราว์เซอร์
JavaScript มีสองวิธีในตัวสำหรับเว็บเพจในการดึงค่าสุ่ม และจัดอยู่ในกลุ่มที่แตกต่างกัน Math.random() เป็น PRNG ทั่วไป: มาตรฐานภาษาปล่อยให้อัลกอริทึมขึ้นอยู่กับแต่ละเบราว์เซอร์และไม่ได้รับประกันเรื่องความปลอดภัย — เหมาะสำหรับภาพเคลื่อนไหว แต่ไม่เหมาะสำหรับการจับฉลากที่อาจมีคนโต้แย้ง ส่วนอีกวิธีหนึ่งคือ Web Crypto API โดยฟังก์ชัน crypto.getRandomValues() จะส่งคืนค่าสุ่มที่ปลอดภัยทางวิทยาการเข้ารหัสลับ ซึ่งสร้างโดย CSPRNG ที่ได้รับค่าตั้งต้นจากเอนโทรปีของระบบปฏิบัติการ
เครื่องมือสุ่มตัวเลขออนไลน์ของเราใช้ Web Crypto API ในการสุ่มทุกครั้ง และตัวเลขจะถูกสร้างขึ้นในเบราว์เซอร์ของคุณแทนที่จะเป็นบนเซิร์ฟเวอร์ แหล่งกำเนิดเดียวกันนี้ยังใช้ขับเคลื่อนเครื่องมืออื่นๆ บนเว็บไซต์นี้ ไม่ว่าคุณจะทอยลูกเต๋า โยนเหรียญ หรือสร้างรหัสผ่าน
จากบิตสุ่มสู่ตัวเลขในช่วงที่คุณต้องการ
เครื่องมือสร้างตัวเลขที่ปลอดภัยทางวิทยาการเข้ารหัสลับเป็นเพียงครึ่งหนึ่งของการสุ่มที่ยุติธรรม มันให้บิตข้อมูลดิบมา และโปรแกรมยังคงต้องแปลงบิตเหล่านั้นให้เป็นตัวเลขในช่วงที่คุณต้องการ — และนี่คือจุดที่ความเอนเอียงอาจแทรกซ้อนเข้ามาได้ สมมติว่าแหล่งกำเนิดให้ค่า 0 ถึง 9 ด้วยโอกาสที่เท่ากัน และคุณต้องการตัวเลขตั้งแต่ 0 ถึง 5 การนำเศษที่เหลือจากการหารด้วย 6 อาจดูเป็นธรรมชาติ แต่เลข 0, 1, 2 และ 3 จะมีโอกาสเกิดขึ้นได้สองทาง ในขณะที่ 4 และ 5 เกิดขึ้นได้เพียงทางเดียว ดังนั้นตัวเลข 0 ถึง 3 แต่ละตัวจึงมีโอกาส 20% ส่วน 4 และ 5 มีโอกาสเพียง 10% แต่ละตัว วิธีหนึ่งในการขจัดโอกาสที่ไม่เท่ากัน (modulo bias) นี้คือการทิ้งค่าที่ไม่พอดีแล้วสุ่มใหม่ ซึ่งคู่มือการสุ่มตัวเลขจะอธิบายเรื่องนี้โดยละเอียด
ยังมีอีกสองเรื่องที่มักสร้างความประหลาดใจ การออกซ้ำเป็นเรื่องปกติ: เมื่อสุ่มจำนวนเต็มตั้งแต่ 1 ถึง 10 อย่างเป็นอิสระต่อกันและทุกตัวเลขมีโอกาสเท่ากัน ตัวเลขที่เพิ่งสุ่มได้ก็มีโอกาส 1 ใน 10 ที่จะออกซ้ำเท่ากับตัวเลขอื่นๆ การสุ่มแบบไม่ซ้ำจึงเป็นรูปแบบการสุ่มคนละประเภท ไม่ใช่ว่ามีความสุ่มมากกว่า และเครื่องมือสุ่มที่ยุติธรรมเพียงอย่างเดียวไม่ได้ทำให้กระบวนการทั้งหมดยุติธรรม: รายชื่อผู้เข้าร่วมและจำนวนครั้งที่กดสุ่มก็มีความสำคัญไม่แพ้กัน ดังที่บทความของเราเกี่ยวกับวิธีสุ่มเลือกผู้ชนะการแข่งขันได้อธิบายไว้