หน้าแรก
วิธีการสั่งซื้อสินค้า
แจ้งชำระเงิน
บทความ
เว็บบอร์ด
เกี่ยวกับเรา
ติดต่อเรา
หน้าแรก
>
บทความ
>
ศาสตร์แห่งการสุ่ม - RANDOM
ค้นหาบทความที่นี่
บทความทั้งหมด
ศาสตร์แห่งการสุ่ม - RANDOM
5 ปีที่ผ่านมา
โดย
เจ้าของร้าน
Publish : 19 JUNE 2020
หลังจากที่ผู้เขียนได้ดูคลิปของ 9arm เรื่อง RNG หรือเต็ม ๆ คือ Random Number Generator (ซึ่งได้ความรู้ในเรื่องขั้นตอน วิธีการต่าง ๆ อธิบายไว้ดีมากครับ
สามารถคลิกที่นี่เพื่อไปดูทางยูทูป
) หลังจากที่นั่งฟังแล้วผู้เขียนก็มานั่งนึกว่า ไม่ค่อยมีใครเขียนเรื่องให้ Arduino สุ่มเลขพวกนี้มาเลยเนอะ (อย่างน้อยก็เท่าที่ผู้เขียนได้ผ่าน ๆ มา) อาจเพราะมันเป็นคำสั่งที่ไม่ค่อยจริงจังเท่าไร ส่วนมากที่เขียนก็มักใช้ในเกมส์ทั้งหลาย สุ่มเลขขึ้นมาเพื่อการสุ่มสิ่งต่าง ๆ แต่ความจริงเราก็สามารถใช้ในการสุ่มหาเลขที่ไม่ซ้ำเพื่อใช้ประโยชน์ต่าง ๆ เช่น One Time Password ก็ได้ หรือจะไปสุ่มเลขออกหวยเล่นกันขำ ๆ กับเพื่อนเป็นกิจกรรมยามว่างก็ได้ (การพนันเป็นสิ่งผิดกฏหมายนะครับ)
เมื่อเรามีความคิดแบบนั้นก็กลับไปดูที่หน้า Reference ของ Arduino นั้นก็จะพบว่าคำสั่งในการสุ่มตัวเลขอะไรมาซักอย่างจะมีอยู่ด้วยกันสองคำสั่ง ได้แก่
random()
randomSeed()
ในการใช้งานหากต้องการให้ Arduino สุ่มเลขอะไรออกมาสักตัว เราจะใช้เพียงคำสั่ง random() เท่านั้น ส่วน randomSeed() คืออะไร ใครที่คลิกไปดูคลิป 9arm มาแล้วก็คงจะพอนึกออก แต่ใครที่ยังไม่ได้ดู จะเก็บไว้ดูตอนหลังก็ไม่เป็นไรครับ เดี๋ยวจะอธิบายให้ฟังกัน เรามาเริ่มกันที่ random() กันก่อนครับ ในการใช้งานจะมีรูปแบบคำสั่งดังนี้
random(
max
)
หรือ
random(
min
,
max
)
โดย
min
คือ ค่าต่ำสุดที่จะถูกสุ่มออกมา ซึ่งในการสุ่มจะรวมค่านี้ด้วย (ไม่บังคับ)
และ
max
คือ ค่าสูงสุดที่จะถูกสุ่มออกมา ในการสุ่มจะไม่รวมจำนวนนี้
อาจดูงง ๆ คำอธิบายคือ min นี่ในโปรแกรมจะไม่บังคับให้เราใส่ แต่หากเราใส่ลงไปมันอาจสุ่มได้ค่านี้ออกมา ส่วนค่า max เราต้องใส่แต่โปรแกรมมันจะไม่เอาเลขนี้ออกมา เช่นเราใส่เป็น (0, 100) เลขที่สุ่มออกมาอาจเป็น 0 ก็ได้ แต่จะไม่มี 100 เด็ดขาด ค่าสูงสุดก็จะเป็น 99 เป็นต้น
และอีกสิ่งที่ย้ำอีกครั้งคือการสุ่มนี้เป็นการสุ่มแบบ pseudo-random คือการ "สุ่มแบบเทียม" เนื่องจากการทำงานของ Arduino พื้นฐานมันทำงานบนระบบดิจิตอล ทุกอย่างต้องเป็นตรรก 0 หรือ 1 ตามระบบเลขฐานสองเท่านั้น การสุ่มมันก็ต้องมีขั้นตอนการคำนวณผ่านขั้นตอนของไมโครคอนโทรลเลอร์ และจะมีค่าเริ่มต้นค่าหนึ่งในการไปใช้ตั้งต้นคำนวณนี้ ฉะนั้นตัวเลขที่ได้ออกมามันจะมีรูปแบบที่ตายตัว เช่น 15 21 38 46 ... เมื่อมันสุ่มถึงจุดหนึ่งจนวนกลับมาก็อาจได้เลข 15 21 38 นี้อีกรอบซ้ำ ๆ เป็นเลขเดิม ๆ หากไปเจอคนที่เก่งคณิตศาสตร์ เขาก็อาจจับรูปแบบการสุ่มได้ และสามารถคำนวณหาความน่าจะเป็นของเลขที่จะถูกสุ่มออกมาได้นั่นเอง
ด้วยเหตุนี้เองจึงมีการแก้ปัญหาด้วยการ Seed มันคือการเปลี่ยนค่าตั้งต้นที่นำไปใช้ในการสุ่ม ซึ่งแม้กระบวนการและวิธีการจะเหมือนเดิมแต่ค่าตั้งต้นเปลี่ยนผลลัพธ์ที่ออกมาก็จะเปลี่ยนไปนั่นเอง มาลองคิดกัน สมมติว่าการสุ่มจะใช้สมการ x - 3 หากค่าตั้งต้นที่ Arduino มันหยิบมาคือ 10 ผลลัพธ์ก็จะได้ 7 ตลอดใช่มั๊ย แต่หากเราเปลี่ยนค่าบังคับให้มันใช้ x = 57 สมการเดิม ผลลัพธ์ก็จะเปลี่ยนไปเป็น 54 นั่นเอง ซึ่งค่า Seed นี้ก็ได้มาจากสารพัดสิ่งได้เลย เช่น ให้ผู้ใช้ใส่ลงไป ตรวจวัดมาจากค่าสนามแม่เหล็ก จากอุณหภูมิ จากความชื้นในอากาศ ความชื้นในดิน ค่าแสงในขณะนั้น ใด ๆ ที่เซ็นเซอร์สามารถวัดออกมาเป็นตัวเลขได้ แม้แต่เวลาตอนนั้นวินาทีที่เท่าไร หรือเสี้ยวของวินาทีที่เท่าไรก็สามารถนำมาใช้ได้ โดยปกติการ Seed นั้นจะทำครั้งเดียวใน setup() คือการใช้ค่า ณ เวลาที่เปิดเครื่องขึ้นมา แต่หากใครต้องการความปลอดภัยสูง จะทำการ Seed ทุกครั้งที่ทำการสุ่มก็ไม่ผิดแต่อย่างใดครับ
หลังจากโม้กันมามาก มาลองดูวิธีใช้งานกันบ้างดีกว่า จะขอสุ่มหน้าลูกเต๋า 1 ลูก ทุก ๆ 5 วินาที แสดงผลทาง Serial monitor ซึ่งหน้าลูกเต๋าก็จะมีเลข 1 ถึง 6 ฉะนั้นในคำสั่งของเราค่า min ก็คือ 1 และค่า max คือ 7 (รวมขอบล่าง ไม่รวมขอบบน) ก็จะได้โปรแกรมสั้น ๆ ดังนี้ครับ
ลองมาดูการทำงานก็จะสุ่มเลขออกมาดังภาพ
อย่างที่กล่าวว่าถ้าใช้ random() เฉย ๆ ตัวเลขที่สุ่มออกมามันจะมี Pattern เดิม ๆ ทำให้สามารถเดาเลขที่จะออกมาได้ เราจะ Seed ลงไปในโปรแกรมด้านล่างนี้ โดยเลขที่จะ Seed นั้นจะใช้ค่าอนาล็อกที่อ่านได้จากขา A0 ที่ไม่ได้ต่ออะไรไว้เลย เมื่อไม่ได้ต่ออะไรไว้แล้วขาจะอยู่ในสถานะ float เป็นค่าที่เด้งไปเด้งมาระหว่าง 0 ถึง 1023 ไม่มีความแน่นอน จึงถือเป็นการสุ่มที่แม้จริง เราทำการอ่านค่าแล้วนำค่านั้นมาใช้ Seed ลงไปเลยก็ถือว่าใช้การสุ่มที่ค่อนข้างจะสุ่มจริง ๆ สูงมาก
ลองดูอีกทีครับ Pattern ของเลขที่ถูกสุ่มออกมาความสัมพันธ์มันจะเปลี่ยนไป (ใครเก่งและว่างก็ลองถอดความสัมพันธ์ของเลขสองชุดนี้ดูนะครับ รับรองว่ามันต่างกันจริง ๆ)
เท่านี้เราก็ได้โปรแกรมง่าย ๆ ไว้สุ่มจำนวนออกมา ใครจะประยุกต์ใช้อะไรขึ้นอยู่กับความคิดแล้วหล่ะครับ วันนี้ก็บทความง่าย ๆ ไม่มีอะไรให้สรุปมากก็ขอตัดจบไปเร็ว ๆ เลย สวัสดีครับ
tutorial
,
random
,
random number
,
random arduino
,
Arduino
,
สุ่มเลข
,
Arduino สุ่มเลข
Share
Share :
COPY
Privacy Policy
|
Cookie Policy
|
Copyright © 2025
fitrox.lnwshop.com
All rights reserved.
ตะกร้า
(
0
)
▲
▼
รายการสั่งซื้อของฉัน
เข้าสู่ระบบด้วย
เข้าสู่ระบบ
สมัครสมาชิก
ยังไม่มีบัญชีเทพ
สร้างบัญชีใหม่
ไม่มีค่าใช้จ่าย
สมัครสมาชิก (ฟรี)
รายการสั่งซื้อของฉัน
ข้อมูลร้านค้านี้
Fitrox Electronics
ไฟทร็อก อิเล็กทรอนิกส์ จำหน่ายอุปกรณ์อิเล็กทรอนิกส์ บอร์ดไมโครคอนโทรลเลอร์ และอุปกรณ์สำหรับโปรเจคต่างๆ อ.เมือง จ.เชียงใหม่ (หลัง มช.)
เบอร์โทร :
0897245633
อีเมล :
fitrox.electronics@gmail.com
ส่งข้อความติดต่อร้าน
เกี่ยวกับร้านค้านี้
ค้นหาสินค้าในร้านนี้
ค้นหา
หรือค้นหาอย่างละเอียด
ค้นหาสินค้า
สินค้าที่ดูล่าสุด
{{pdata.name}}
ดูสินค้าทั้งหมดในร้าน
สินค้าที่ดูล่าสุด
บันทึกเป็นร้านโปรด
Join เป็นสมาชิกร้าน
แชร์หน้านี้
แชร์หน้านี้
↑
TOP
เลื่อนขึ้นบนสุด
คุณมีสินค้า
0
ชิ้นในตะกร้า
สั่งซื้อทันที
สินค้าในตะกร้า ({{total_num}} รายการ)
ขออภัย ขณะนี้ยังไม่มีสินค้าในตะกร้า
ราคาสินค้าทั้งหมด
฿ {{price_format(total_price)}}
- ฿ {{price_format(discount.price)}}
ราคาสินค้าทั้งหมด
{{total_quantity}} ชิ้น
฿ {{price_format(after_product_price)}}
ราคาไม่รวมค่าจัดส่ง
ดูสินค้าในตะกร้า
เริ่มการสั่งซื้อ
➜
เลือกซื้อสินค้าเพิ่ม
พูดคุย-สอบถาม
อีเมล fitrox.electronics@gmail.com
โทร 0897245633
channel/UCnHfpCdqN1RkzAfEH_lRLvw?
1924052434588436
Add @zpq2828r