เราเรียนรู้อะไรจากหนังสือ?
วิธีที่ชัดเจนและใช้งานง่ายที่สุดคือการสร้างตัวเลขสุ่มใน Java ด้วยการโทรง่าย ๆ :
java.lang.math.random ()
ในภาษาอื่น ๆ ทั้งหมดการสร้างตัวเลขแบบสุ่มก็เหมือนกับการใช้คลาสเครื่องมือคณิตศาสตร์เช่น ABS, POW, Floor, SQRT และฟังก์ชั่นทางคณิตศาสตร์อื่น ๆ คนส่วนใหญ่เรียนรู้เกี่ยวกับหมวดหมู่นี้ผ่านหนังสือบทเรียนและหลักสูตร ตัวอย่างง่ายๆ: หมายเลขจุดลอยตัวสองจุดสามารถสร้างได้จาก 0.0 ถึง 1.0 จากนั้นผ่านข้อมูลข้างต้นผู้พัฒนาต้องการสร้างหมายเลขจุดลอยตัวสองเท่าระหว่าง 0.0 ถึง 10.0 และเขียนเช่นนี้:
math.random () * 10
หากมีการสร้างจำนวนเต็มระหว่าง 0 ถึง 10 มันจะถูกเขียนเป็น:
Math.Round (Math.Random () * 10)
ขั้นสูง
โดยการอ่านซอร์สโค้ดของ Math.random () หรือเพียงแค่ใช้ฟังก์ชั่นการทำให้เสร็จสิ้นอัตโนมัติของ IDE นักพัฒนาสามารถพบได้อย่างง่ายดายว่า java.lang.math.random () ใช้วัตถุที่สร้างขึ้นแบบสุ่มภายใน - วัตถุที่ทรงพลังมาก การสร้าง: ค่าบูลีนทุกประเภทตัวเลขและแม้แต่การแจกแจงแบบเกาส์ ตัวอย่างเช่น:
ใหม่ java.util.random (). Nextint (10)
มันมีข้อเสียนั่นคือมันเป็นวัตถุ วิธีการของมันจะต้องเรียกผ่านอินสแตนซ์ซึ่งหมายความว่าตัวสร้างของมันจะต้องเรียกว่าก่อน หากมีหน่วยความจำที่เพียงพอการแสดงออกเช่นเดียวกับด้านบนเป็นที่ยอมรับ
โซลูชันง่ายๆที่สามารถหลีกเลี่ยงการสร้างอินสแตนซ์ใหม่ทุกครั้งที่มีการสุ่มหมายเลขคือการใช้คลาสคงที่ คุณอาจคิดว่า java.lang.math ดีมากเรากำลังปรับปรุงการเริ่มต้นของ java.lang.math แม้ว่าโครงการนี้จะอยู่ในระดับต่ำ แต่คุณต้องทำการทดสอบหน่วยง่ายๆเพื่อให้แน่ใจว่าจะไม่ผิดพลาด
สมมติว่าโปรแกรมจำเป็นต้องสร้างหมายเลขสุ่มเพื่อจัดเก็บปัญหาจะเกิดขึ้นอีกครั้ง ตัวอย่างเช่นบางครั้งจำเป็นต้องใช้งานหรือปกป้องเมล็ดพันธุ์และมีการใช้หมายเลขภายในเพื่อจัดเก็บสถานะและคำนวณหมายเลขสุ่มถัดไป ในกรณีพิเศษเหล่านี้มันไม่เหมาะสมที่จะแบ่งปันวัตถุที่สร้างแบบสุ่ม
พร้อมกัน
ในสภาพแวดล้อมของแอปพลิเคชัน Java EE multithreaded วัตถุอินสแตนซ์ที่สร้างขึ้นแบบสุ่มยังสามารถเก็บไว้ในคลาสหรือคลาสการใช้งานอื่น ๆ เป็นคุณสมบัติคงที่ โชคดีที่ java.util.random เป็นแบบด้ายที่ปลอดภัยดังนั้นจึงไม่มีความเสี่ยงที่การโทรหลายเธรดจะทำลายเมล็ด
อีกสิ่งที่ควรพิจารณาคืออินสแตนซ์แบบมัลติเธรดของ java.lang.threadlocal วิธีการที่ขี้เกียจคือการใช้อินสแตนซ์เดียวผ่าน Java เอง API
แม้ว่า Java จะไม่ได้เป็นวิธีที่ดีในการจัดการอินสแตนซ์เดียวของ java.util.random อย่างไรก็ตาม Java 7 ที่รอคอยมานานเป็นวิธีใหม่ในการสร้างตัวเลขสุ่ม:
java.util.concurrent.threadlocalrandom.current (). Nextint (10)
API ใหม่นี้รวมข้อดีของสองวิธีอื่น ๆ : อินสแตนซ์เดี่ยว/การเข้าถึงแบบคงที่ซึ่งมีความยืดหยุ่นเท่ากับ math.random () Threadlocalrandom นั้นเร็วกว่าวิธีอื่น ๆ ในการจัดการกับการพร้อมกันสูง
ประสบการณ์
Chris Marasti-Georg ชี้ให้เห็น:
Math.Round (Math.Random () * 10)
ทำให้การกระจายไม่สมดุลเช่น: 0.0 - 0.499999 จะปัดเศษเป็น 0 ในขณะที่ 0.5 ถึง 1.4999999 จะปัดเศษเป็น 1 ดังนั้นวิธีการใช้ไวยากรณ์สไตล์เก่าเพื่อให้ได้การกระจายที่สมดุลที่ถูกต้องดังนี้:
Math.floor (Math.Random () * 11)
โชคดีถ้าเราใช้ java.util.random หรือ java.util.concurrent.threadlocalrandom เราไม่ต้องกังวลเกี่ยวกับข้างต้น
โครงการภาคปฏิบัติ Java แนะนำอันตรายบางอย่างของการใช้ Java.util.random API อย่างไม่ถูกต้อง บทเรียนนี้บอกให้เราไม่ใช้:
math.abs (rnd.nextint ())%n
และใช้:
rnd.nextint (n)
ythe ข้างต้นเป็นการแนะนำที่เกี่ยวข้องกับตัวเลขสุ่มใน Java และฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคน