คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 4
TL;DR set.seed(seed)
http://rfunction.com/archives/62
คอมพิวเตอร์มีเลขสุ่มอยู่สองแบบ
- deterministic random number generator เลขสุ่มแบบทำซ้ำ คาดการณ์ได้
ใช้วิธีการทางคณิตศาสตร์สร้างเลข "ดูเหมือนสุ่ม" เรียกว่า pseudo-random number generator (PRNG)
ซึ่งวิธีการนี้จะมี "ค่าเริ่มต้น" ของสถานะ generator เรียกว่า seed
นั่นคือ ถ้ากำหนดการสุ่มด้วย seed ที่เหมือนกัน จะได้การสุ่มที่เหมือนกัน
- ข้อดีคือ สุ่มได้ทีละมาก ๆ ได้เร็วดั่งใจ, การคาดเดาการสุ่มได้ดังกล่าว ทำให้ดีบักโปรแกรมที่เราทราบผลลัพธ์ที่ควรจะเป็นได้
- ข้อเสียคือ หากโชคร้าย seed ตกอยู่ภายใต้ฝ่ายตรงข้าม ฝ่ายตรงข้ามก็จะทราบการสุ่มในอนาคตทั้งหมด จนกว่าเราจะเปลี่ยน seed โดยไม่ให้ฝ่ายตรงข้ามทราบได้อีก
- non-deterministic random number generator เลขสุ่มแบบทำซ้ำไม่ได้ คาดการณ์ไม่ได้
นำเข้าค่าสุ่มจากแหล่งกำเนิดภายนอกโปรแกรม แหล่งเดียว หรือหลาย ๆ แหล่งมาผสมผสานกัน
เรียกว่า true random number generator (TRNG)
เช่น เวลาเปิดเครื่อง, จำนวนโปรเซสในระบบ, เซ็นเซอร์อุณหภูมิ, เซ็นเซอร์ภาพ เสียง ฯลฯ [Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
- ข้อจำกัดคือ "ความเร็ว" กล่าวคือความเร็วการผลิตเลขสุ่มขึ้นกับความเร็ว input/output ที่รับจากแหล่งกำเนิดภายนอก
และความเร็วการของสุ่มของแหล่งกำเนิดภายนอกนั้น เช่น การเปลี่ยนแปลงอุณภูมิ ภาพ เสียง ฯลฯ
- ข้อดีคือ จะไม่มีใคร มีทางที่จะทำนายการสุ่มได้เลย (ถ้าออกแบบไว้ดี รัดกุมเพียงพอและอาจให้เป็นชั้นความลับไม่เปิดเผย)
ดังนั้นสิ่งที่ทำกันก็คือใช้ TRNG สุ่มเพื่อได้ seed มา
แล้วนำ seed นั้นใช้กับ PRNG อีกที [Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
จะเห็นได้ว่ากับแค่ "การสุ่ม" จริง ๆ แล้วไม่ใช่เรื่องเล่น ๆ เลย ทว่าเป็นเรื่องของผู้ชำนาญการ
เพราะสามารถเป็นจุดอ่อนของ cryptography ใด ๆ ได้เลยทีเดียวครับ
learn more [Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
http://rfunction.com/archives/62
> set.seed(5)
> rnorm(5)
[1] -0.84085548 1.38435934 -1.25549186 0.07014277 1.71144087
> set.seed(5)
> rnorm(5)
[1] -0.84085548 1.38435934 -1.25549186 0.07014277 1.71144087
> rnorm(5)
[1] -0.84085548 1.38435934 -1.25549186 0.07014277 1.71144087
> set.seed(5)
> rnorm(5)
[1] -0.84085548 1.38435934 -1.25549186 0.07014277 1.71144087
คอมพิวเตอร์มีเลขสุ่มอยู่สองแบบ
- deterministic random number generator เลขสุ่มแบบทำซ้ำ คาดการณ์ได้
ใช้วิธีการทางคณิตศาสตร์สร้างเลข "ดูเหมือนสุ่ม" เรียกว่า pseudo-random number generator (PRNG)
ซึ่งวิธีการนี้จะมี "ค่าเริ่มต้น" ของสถานะ generator เรียกว่า seed
นั่นคือ ถ้ากำหนดการสุ่มด้วย seed ที่เหมือนกัน จะได้การสุ่มที่เหมือนกัน
- ข้อดีคือ สุ่มได้ทีละมาก ๆ ได้เร็วดั่งใจ, การคาดเดาการสุ่มได้ดังกล่าว ทำให้ดีบักโปรแกรมที่เราทราบผลลัพธ์ที่ควรจะเป็นได้
- ข้อเสียคือ หากโชคร้าย seed ตกอยู่ภายใต้ฝ่ายตรงข้าม ฝ่ายตรงข้ามก็จะทราบการสุ่มในอนาคตทั้งหมด จนกว่าเราจะเปลี่ยน seed โดยไม่ให้ฝ่ายตรงข้ามทราบได้อีก
- non-deterministic random number generator เลขสุ่มแบบทำซ้ำไม่ได้ คาดการณ์ไม่ได้
นำเข้าค่าสุ่มจากแหล่งกำเนิดภายนอกโปรแกรม แหล่งเดียว หรือหลาย ๆ แหล่งมาผสมผสานกัน
เรียกว่า true random number generator (TRNG)
เช่น เวลาเปิดเครื่อง, จำนวนโปรเซสในระบบ, เซ็นเซอร์อุณหภูมิ, เซ็นเซอร์ภาพ เสียง ฯลฯ [Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
- ข้อจำกัดคือ "ความเร็ว" กล่าวคือความเร็วการผลิตเลขสุ่มขึ้นกับความเร็ว input/output ที่รับจากแหล่งกำเนิดภายนอก
และความเร็วการของสุ่มของแหล่งกำเนิดภายนอกนั้น เช่น การเปลี่ยนแปลงอุณภูมิ ภาพ เสียง ฯลฯ
- ข้อดีคือ จะไม่มีใคร มีทางที่จะทำนายการสุ่มได้เลย (ถ้าออกแบบไว้ดี รัดกุมเพียงพอและอาจให้เป็นชั้นความลับไม่เปิดเผย)
ดังนั้นสิ่งที่ทำกันก็คือใช้ TRNG สุ่มเพื่อได้ seed มา
แล้วนำ seed นั้นใช้กับ PRNG อีกที [Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
จะเห็นได้ว่ากับแค่ "การสุ่ม" จริง ๆ แล้วไม่ใช่เรื่องเล่น ๆ เลย ทว่าเป็นเรื่องของผู้ชำนาญการ
เพราะสามารถเป็นจุดอ่อนของ cryptography ใด ๆ ได้เลยทีเดียวครับ
learn more [Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
แสดงความคิดเห็น
[ภาษาR] ช่วยอธิบายความหมายของฟังก์ชั่น set.seed(123) ให้เข้าใจง่ายหน่อยค่ะ แล้วใช้เพื่ออะไรคะ
ยกตัวอย่างมายิ่งดีเลยค่ะ