คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 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] คลิกเพื่อดูข้อความที่ซ่อนไว้The Lava Lamps That Help Keep The Internet Secure
6 Nov 2017
https://www.youtube.com/watch?v=1cUUfMeOijg

- ข้อจำกัดคือ "ความเร็ว" กล่าวคือความเร็วการผลิตเลขสุ่มขึ้นกับความเร็ว input/output ที่รับจากแหล่งกำเนิดภายนอก
และความเร็วการของสุ่มของแหล่งกำเนิดภายนอกนั้น เช่น การเปลี่ยนแปลงอุณภูมิ ภาพ เสียง ฯลฯ
- ข้อดีคือ จะไม่มีใคร มีทางที่จะทำนายการสุ่มได้เลย (ถ้าออกแบบไว้ดี รัดกุมเพียงพอและอาจให้เป็นชั้นความลับไม่เปิดเผย)
ดังนั้นสิ่งที่ทำกันก็คือใช้ TRNG สุ่มเพื่อได้ seed มา
แล้วนำ seed นั้นใช้กับ PRNG อีกที [Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้The Difference Between RDRAND and RDSEED
https://software.intel.com/content/www/us/en/develop/blogs/the-difference-between-rdrand-and-rdseed.html
จะเห็นได้ว่ากับแค่ "การสุ่ม" จริง ๆ แล้วไม่ใช่เรื่องเล่น ๆ เลย ทว่าเป็นเรื่องของผู้ชำนาญการ
เพราะสามารถเป็นจุดอ่อนของ cryptography ใด ๆ ได้เลยทีเดียวครับ
learn more [Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้CppCon 2016: Walter E. Brown “What C++ Programmers Need to Know about Header <random>"
30 Sep 2016
https://www.youtube.com/watch?v=6DPkyvkMkk8
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] คลิกเพื่อดูข้อความที่ซ่อนไว้The Lava Lamps That Help Keep The Internet Secure
6 Nov 2017
https://www.youtube.com/watch?v=1cUUfMeOijg

- ข้อจำกัดคือ "ความเร็ว" กล่าวคือความเร็วการผลิตเลขสุ่มขึ้นกับความเร็ว input/output ที่รับจากแหล่งกำเนิดภายนอก
และความเร็วการของสุ่มของแหล่งกำเนิดภายนอกนั้น เช่น การเปลี่ยนแปลงอุณภูมิ ภาพ เสียง ฯลฯ
- ข้อดีคือ จะไม่มีใคร มีทางที่จะทำนายการสุ่มได้เลย (ถ้าออกแบบไว้ดี รัดกุมเพียงพอและอาจให้เป็นชั้นความลับไม่เปิดเผย)
ดังนั้นสิ่งที่ทำกันก็คือใช้ TRNG สุ่มเพื่อได้ seed มา
แล้วนำ seed นั้นใช้กับ PRNG อีกที [Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้The Difference Between RDRAND and RDSEED
https://software.intel.com/content/www/us/en/develop/blogs/the-difference-between-rdrand-and-rdseed.html
จะเห็นได้ว่ากับแค่ "การสุ่ม" จริง ๆ แล้วไม่ใช่เรื่องเล่น ๆ เลย ทว่าเป็นเรื่องของผู้ชำนาญการ
เพราะสามารถเป็นจุดอ่อนของ cryptography ใด ๆ ได้เลยทีเดียวครับ
learn more [Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้CppCon 2016: Walter E. Brown “What C++ Programmers Need to Know about Header <random>"
30 Sep 2016
https://www.youtube.com/watch?v=6DPkyvkMkk8
▼ กำลังโหลดข้อมูล... ▼
แสดงความคิดเห็น
คุณสามารถแสดงความคิดเห็นกับกระทู้นี้ได้ด้วยการเข้าสู่ระบบ
กระทู้ที่คุณอาจสนใจ
อ่านกระทู้อื่นที่พูดคุยเกี่ยวกับ
วิศวกรรมคอมพิวเตอร์
วิทยาศาสตร์คอมพิวเตอร์
การพัฒนาซอฟต์แวร์
ภาษาเบสิก (BASIC programming language)
[ภาษาR] ช่วยอธิบายความหมายของฟังก์ชั่น set.seed(123) ให้เข้าใจง่ายหน่อยค่ะ แล้วใช้เพื่ออะไรคะ
ยกตัวอย่างมายิ่งดีเลยค่ะ