Flash – Growing Animation หรือการ…เจริญเติบโต ?

08/06/2013

Flash – พื้นฐาน AS3 กับตัวชี้เมาส์ หรือ Cursor

07/07/2013

Flash – Action Script 3 กับการสุ่ม

05/07/2013
empty image
empty image

Action Script 3 กับการสุ่ม

         การสุ่มตัวเลขใน AS3 จะใช้เมธอด Math.random() ซึ่งจะได้ค่าระหว่างศูนย์ขึ้นไป แต่ไม่เกิน 1
(0 <= n < 1) ผมทึ่งมากเลย เฮ้ย คิดได้ฟ่ะ เพราะสามารถเอาค่าที่ได้นี้ไปบวกลบคูณหาร เพื่อจำกัดช่วงของตัวเลขที่ต้องการได้ โอ้ว คนคิดฉลาดจริงๆ (ผมโง่เองแหละ) ฮ่าๆๆ

1. ทดลองสุ่ม

พิมพ์โค้ดลงไปในแถบ Action Script หรือกด [F9]

trace(Math.random());

ผลลัพธ์
0.5574625069275498

ซึ่งผลลัพธ์ที่ได้จะไม่ค่ามากกว่าหรือเท่ากับ 0 แต่น้อยกว่า 1 (0 <= n < 1)

2. สุ่มค่าระหว่างตัวเลขที่กำหนด

อย่างที่รู้ ว่ามันจะสุ่มค่าระหว่าง 0 <= n < 1 นั่นแสดงว่าค่าที่ได้ จะไม่เกิน 1 ดังนั้นลองเอาเลขอะไรซักตัวที่มากกว่า 1 ไปคูณดู

trace(Math.random()*10);

ผลลัพธ์ที่ได้จะเป็นเลขที่มากกว่าหรือเท่ากับศูนย์แต่จะไม่เกินสิบ (0 <= n < 10)
แล้วถ้าจะจำกัดค่าต่ำสุดล่ะ ค่าปกติมันคือ 0 อยู่แล้ว ถ้าจะให้ค่าต่ำสุดคือ 5 สูงสุดคือ 10 ล่ะ
แบบนี้

var num:Number = Math.random()*(-1-10+1)+(-1);
trace(num);

ผลลัพธ์
สมมติว่า Math.random() คืนค่า 0 จะได้ 0*(10-5)+5 = 5 ค่าต่ำสุดที่เป็นไปได้คือ 5
สมมติว่า Math.random() คืนค่า 0.9 จะได้ 0.9*(10-5)+5 = 9.5
ค่าที่ได้จะไม่มีทางเกิน 10 เพราะ Math.random สุ่มเลขได้ไม่ถึง 1 เมื่อไม่ถึง 1 เอาเลขใดมาคูณก็จะไม่มีทางเท่าตัวมันเอง

ตัวอย่าง
ถ้าอยากได้ค่าตั้งแต่ 5 ถึง 10 กว่าๆได้แต่ไม่ถึง 11 (min <= n < max+1)
ต้องใช้สูตร Math.random()*(1+สูงสุด-ต่ำสุด)+ต่ำสุด

และถ้าอยากได้ค่าตั้งแต่ 5 แต่ไม่ถึง 10 (min <= n < max)
ต้องใช้สูตร Math.random()*(สูงสุด-ต่ำสุด)+ต่ำสุด

ถ้าอยากสุ่มเฉพาะค่าติดลบล่ะ
     ง่ายมาก ก็ใช้สูตรเดิมนั่นแหละ แต่ใส่เครื่องหมายให้ถูกก็พอ เช่น
อยากได้ค่าระหว่าง -1 ถึง -10 แต่ไม่เกิน -11 ก็ใช้สูตรด้านบนเลย

var num:Number = Math.random()*(-1-10+1)+(-1);

trace(num);


เนื่องจากค่าเป็นลบ เลข 1 ที่นำไปบวกเพิ่มก็เอาออก
ผลลัพธ์
สมมติว่า Math.random() คืนค่า 0 จะได้ 0*(-11)-1 = -1 ค่าต่ำสุดที่เป็นไปได้คือ -1
สมมติว่า Math.random() คืนค่า 0.9 จะได้ 0.9*(-11)-1 = -10.9 ค่าสูงสุดที่เป็นไปได้จะอยู่ประมาณ 10.9 ไม่มีทางถึง 11

ถ้าอยากสุ่มได้ค่าติดลบด้วย และค่าบวกด้วยล่ะ
ก็สูตรเดิมนั่นแหละ เพียงแต่ใช้เครื่องหมายให้ถูกก็พอ
สมมติจะสุ่มค่าระหว่าง -10 ถึง 10 แต่ไม่เกิน 11 สูตรจะเป็น Math.random()*(1+10-(-10))+(-10)

ผลลัพธ์
สมมติว่า Math.random() คืนค่า 0 จะได้ 0*(21)-10 = -10 ค่าต่ำสุดที่เป็นไปได้คือ -10
สมมติว่า Math.random() คืนค่า 0.9 จะได้ 0.9999*(21)-10 = 10.9979 ซึ่งค่าที่ได้จะไม่มีทางถึง 11

ดูไปดูมาเริ่มงง… ถ้าอยากให้ระหว่าง 1 ถึง 10 โดยไม่เกิน 10 หรือ 10.1 ก็ไม่ได้ ก็ให้เอาเลขโดดที่บวกเข้าไป 1 ให้เอาออก ก็จะได้สูตร Math.random()*(สูงสุด-ต่ำสุด)+ต่ำสุด

3. การปัดเศษ

การปัดเศษจะใช้อยู่ 3 เมธอดคือ

Math.ceil() – จะตัดทศนิยมทิ้งไปเลย และปัดตัวเลขขึ้น 1 เช่น 9.1 ก็เป็น 10
Math.floor() – จะตัดทศนิยมทิ้งไปเลยอย่างไม่ใยดี เช่น 9.9 ก็เป็น 9
Math.round() – ดูก่อน ถ้าเกินเลขทศนิยมเกิน 5 ปัดขึ้น ถ้าต่ำกว่าก็ปัดลง เช่น 9.1 ปัดลงเหลือ 9 แต่ 9.5 ปัดขึ้นเป็น 10

3.1 เลือกเอาทศนิยม x ตำแหน่ง
ก็ใช้เมธอดข้างบน ถ้าจะยังไม่ปัดเศษ ก็ใช้ Math.floor() *10^ตำแหน่ง / 10^ตำแหน่ง เช่น
num = 10.9876 จะเอาทศนิยม 2 ตำแหน่ง โดยไม่ปัดขึ้นหรือลงก่อน จะใช้ Math.floor(num*100)/100
การทำงาน 10.9876*100 = 1098.76 จากนั้น floor จะตัดเศษทิ้งไปเลย จะได้ 1098 แล้วหารด้วย 100 จะได้ผลลัพธ์เป็น 10.98

แต่ถ้าใช้ Math.ceil() การทำงาน 10.9786*100 = 1098.76 จากนั้น ceil จะปัดขึ้นเป็น 1099 แล้วหารด้วย 100 จะได้ 10.99

ตัวอย่าง

 

การประยุกต์ใช้

       คือมันเยอะเยะมากมาย แล้วแต่ใครจะคิดได้ เช่นสุ่มตัวเลข สุ่มตำแหน่ง สุ่มตัวอักษร สุ่มค่าในอาเรย์  สุ่ม สุ่มไก่ สุ่มๆๆๆ โอ้ย.. Zzz

– ตัวอย่างการสุ่มตัวอักษร

ขี้เกียจอธิบายโค้ดจัง -..- เดี๋ยวมีคนถามค่อยอธิบาย ฮ่าๆๆ

Download File
https://www.dropbox.com/s/p52kgjkugmgu1yn/random.fla
https://www.dropbox.com/s/vsvo0j688t4074y/random_text.fla

Ref.
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/String.html
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Math.html#random()
http://www.kirupa.com/flash/advanced_random_numbers_as3.htm
http://www.actionscriptmoron.com/AS3Tutorials/math-random/

Zzz