คลาสสุ่ม (java.util)
อัลกอริทึมแบบสุ่มที่ใช้ในคลาสสุ่มคือเทียม-สุ่มนั่นคือการสุ่มด้วยกฎ เมื่อทำการสุ่มจำนวนต้นกำเนิดของอัลกอริทึมแบบสุ่มเรียกว่าเมล็ดซึ่งดำเนินการเปลี่ยนแปลงบางอย่างตามเมล็ดซึ่งจะสร้างตัวเลขสุ่มที่ต้องการ
วัตถุสุ่มที่มีจำนวนเมล็ดเท่ากันตัวเลขสุ่มที่สร้างขึ้นจากจำนวนครั้งเดียวกันนั้นเหมือนกัน กล่าวอีกนัยหนึ่งสำหรับวัตถุสุ่มสองรายการที่มีหมายเลขเมล็ดเดียวกันตัวเลขสุ่มที่สร้างขึ้นเป็นครั้งแรกจะเหมือนกันและตัวเลขสุ่มที่สร้างขึ้นเป็นครั้งที่สองจะเหมือนกัน สิ่งนี้ต้องการความสนใจเป็นพิเศษเมื่อสร้างตัวเลขสุ่มหลายตัว
ต่อไปนี้อธิบายถึงการใช้คลาสสุ่มรวมถึงวิธีการสร้างอาร์เรย์แบบสุ่มของช่วงเวลาที่ระบุและโอกาสที่จำเป็นในโปรแกรมการใช้งาน
1. การสร้างวัตถุสุ่ม
คลาสสุ่มมีสองตัวสร้างซึ่งมีการแนะนำในลำดับด้านล่าง:
. สุ่มสาธารณะ ()
วิธีการก่อสร้างนี้ใช้ตัวเลขที่เกี่ยวข้องกับเวลาสัมพัทธ์ที่สอดคล้องกับเวลาของระบบปัจจุบันเป็นหมายเลขเมล็ดจากนั้นใช้หมายเลขเมล็ดนี้เพื่อสร้างวัตถุสุ่ม
ข. สุ่มสาธารณะ (เมล็ดยาว)
ตัวสร้างนี้สามารถสร้างขึ้นได้โดยการกำหนดหมายเลขเมล็ด
รหัสตัวอย่าง:
การคัดลอกรหัสมีดังนี้:
สุ่ม r = ใหม่สุ่ม ();
สุ่ม R1 = ใหม่สุ่ม (10);
อีกครั้ง: จำนวนเมล็ดเป็นเพียงจำนวนต้นกำเนิดของอัลกอริทึมแบบสุ่มและไม่มีส่วนเกี่ยวข้องกับช่วงเวลาของตัวเลขสุ่มที่สร้างขึ้น
2. วิธีการทั่วไปในคลาสสุ่ม
วิธีการในคลาสแบบสุ่มนั้นค่อนข้างง่ายและฟังก์ชั่นของแต่ละวิธีก็เข้าใจได้ง่าย ควรสังเกตว่าตัวเลขสุ่มที่สร้างขึ้นโดยแต่ละวิธีในคลาสสุ่มมีการกระจายอย่างสม่ำเสมอซึ่งหมายความว่าความน่าจะเป็นของการสร้างตัวเลขภายในช่วงเวลาเท่ากัน นี่คือการแนะนำขั้นพื้นฐานเกี่ยวกับวิธีการเหล่านี้:
. บูลีนสาธารณะ NextBoolean ()
ฟังก์ชั่นของวิธีนี้คือการสร้างค่าบูลีนแบบสุ่มและความน่าจะเป็นของการสร้างค่าที่แท้จริงและเท็จเท่ากับนั่นคือทั้งสองเป็น 50%
ข. Public Double NextDouble ()
วัตถุประสงค์ของวิธีนี้คือการสร้างค่าสองครั้งแบบสุ่มโดยมีค่าระหว่าง [0, 1.0)
C, Public Int Nextint ()
วัตถุประสงค์ของวิธีนี้คือการสร้างค่าอินเตอร์แบบสุ่มซึ่งอยู่ระหว่าง -231 และ 231-1
หากคุณต้องการสร้างค่า int สำหรับช่วงเวลาที่กำหนดคุณต้องทำการแปลงทางคณิตศาสตร์บางอย่าง สำหรับรายละเอียดโปรดดูรหัสในตัวอย่างการใช้งานด้านล่าง
D, Public Int Nextint (int n)
ฟังก์ชั่นของวิธีนี้คือการสร้างค่า int แบบสุ่มซึ่งอยู่ภายในช่วงเวลาของ [0, n) นั่นคือค่า int แบบสุ่มระหว่าง 0 และ n ที่มี 0 แต่ไม่ใช่ n
หากคุณต้องการสร้างค่า int สำหรับช่วงเวลาที่กำหนดคุณต้องทำการแปลงทางคณิตศาสตร์บางอย่าง สำหรับรายละเอียดโปรดดูรหัสในตัวอย่างการใช้งานด้านล่าง
E, โมฆะสาธารณะ setseed (เมล็ดยาว)
วัตถุประสงค์ของวิธีนี้คือการรีเซ็ตจำนวนเมล็ดในวัตถุสุ่ม หลังจากตั้งค่าจำนวนเมล็ดวัตถุสุ่มจะเหมือนกับวัตถุสุ่มที่สร้างขึ้นด้วยคำหลักใหม่
3. ตัวอย่างการใช้งานแบบสุ่มชั้นเรียน
การใช้คลาสแบบสุ่มโดยทั่วไปจะสร้างตัวเลขสุ่มสำหรับช่วงเวลาที่กำหนด ต่อไปนี้จะแนะนำวิธีการสร้างตัวเลขสุ่มสำหรับช่วงเวลาที่สอดคล้องกันทีละคน รหัสต่อไปนี้ที่สร้างตัวเลขสุ่มถูกสร้างขึ้นโดยใช้วัตถุสุ่มต่อไปนี้ r:
สุ่ม r = ใหม่สุ่ม ();
. สร้างทศนิยมของช่วงเวลา [0, 1.0)
การคัดลอกรหัสมีดังนี้:
double d1 = r.nextdouble ();
ได้รับโดยตรงโดยใช้วิธี NextDouble
ข. สร้างทศนิยมของช่วงเวลา [0,5.0)
การคัดลอกรหัสมีดังนี้:
double d2 = r.nextdouble () * 5;
เนื่องจากช่วงเวลาตัวเลขที่สร้างขึ้นโดยวิธี NextDouble คือ [0, 1.0) การขยายช่วงเวลา 5 เท่าจึงเป็นช่วงเวลาที่ต้องการ
ในทำนองเดียวกันในการสร้างทศนิยมแบบสุ่มในช่วงเวลา [0, D) และ D เป็นทศนิยมเชิงบวกใด ๆ คุณจะต้องคูณค่าผลตอบแทนของวิธี NextDouble โดย D
ค. สร้างทศนิยมในช่วงเวลา [1,2.5)
การคัดลอกรหัสมีดังนี้:
double d3 = r.nextdouble () * 1.5 + 1;
ในการสร้างทศนิยมแบบสุ่มของช่วงเวลา [1, 2.5) คุณจะต้องสร้างจำนวนสุ่มของช่วงเวลา [0, 1.5) ก่อนจากนั้นเพิ่ม 1 ในช่วงเวลาสุ่มที่สร้างขึ้น
ในทำนองเดียวกันในการสร้างหมายเลขสุ่มใด ๆ ในช่วงของช่วงเวลาทศนิยม [D1, D2) ที่ไม่ได้เริ่มต้นจาก 0 (โดยที่ D1 ไม่เท่ากับ 0) คุณจะต้องสร้างหมายเลขสุ่มในช่วงเวลา [0, D2-D1) ก่อนจากนั้นเพิ่มช่วงเวลาสุ่มที่สร้างขึ้นเป็น D1
d. สร้างจำนวนเต็มใด ๆ
การคัดลอกรหัสมีดังนี้:
int n1 = r.nextint ();
เพียงใช้วิธีการ Nextint โดยตรง
ก. สร้างจำนวนเต็มในช่วงเวลา [0,10)
การคัดลอกรหัสมีดังนี้:
int n2 = r.nextint (10);
n2 = math.abs (r.nextint () % 10);
รหัสสองบรรทัดข้างต้นสามารถสร้างจำนวนเต็มในช่วงเวลา [0,10)
การใช้งานครั้งแรกจะถูกนำไปใช้โดยตรงโดยใช้วิธี NextInt (Int N) ในคลาสสุ่ม
ในการใช้งานครั้งที่สองวิธีการโทรครั้งแรก NextInt () เพื่อสร้างหมายเลข int โดยพลการ ช่วงเวลาที่สร้างขึ้นโดยจำนวนผลรวม 10 คือ (-10,10) จากนั้นค้นหาค่าสัมบูรณ์ของช่วงเวลาและช่วงเวลาที่ได้คือ [0,10)
ในทำนองเดียวกันในการสร้างจำนวนเต็มแบบสุ่มในทุกช่วงเวลา [0, n) คุณสามารถใช้รหัสต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
int n2 = r.nextint (n);
n2 = math.abs (r.nextint () % n);
f. สร้างจำนวนเต็มในช่วงเวลา [0,10]
การคัดลอกรหัสมีดังนี้:
int n3 = r.nextint (11);
n3 = math.abs (r.nextint () % 11);
เมื่อเปรียบเทียบกับช่วงเวลาจำนวนเต็มช่วงเวลา [0,10] และช่วงเวลา [0,11) นั้นเทียบเท่าดังนั้นจึงมีการสร้างจำนวนเต็มของช่วงเวลา [0,11)
กรัม สร้างจำนวนเต็มในช่วงเวลา [-3,15)
การคัดลอกรหัสมีดังนี้:
int n4 = r.nextint (18) - 3;
n4 = math.abs (r.nextint () % 18) - 3;
ในการสร้างจำนวนเต็มแบบสุ่มที่ไม่ได้เริ่มต้นจาก 0 คุณสามารถอ้างถึงคำอธิบายข้างต้นของหลักการการนำไปปฏิบัติของช่วงเวลาทศนิยมที่ไม่ได้เริ่มจาก 0
H, โอกาสที่จะบรรลุ
การใช้ตรรกะของโปรแกรมตามโอกาสที่แน่นอนก็เป็นปัญหาที่สามารถแก้ไขได้โดยการประมวลผลแบบสุ่ม นี่คือตัวอย่างง่ายๆในการสาธิตวิธีการใช้ตรรกะของโอกาสโดยใช้ตัวเลขสุ่ม
ในการแนะนำวิธีการก่อนหน้านี้ตัวเลขที่สร้างขึ้นในวิธี Nextint (int n) นั้นเป็นเครื่องแบบนั่นคือโอกาสในการสร้างแต่ละหมายเลขภายในช่วงเวลาเดียวกัน จากนั้นหากมีการสร้างจำนวนเต็มแบบสุ่มในช่วงเวลา [0,100) โอกาสของแต่ละตัวเลขที่ถูกสร้างควรจะเหมือนกันและเนื่องจากมีจำนวนเต็ม 100 จำนวนในช่วงเวลาโอกาสของแต่ละหมายเลขคือ 1% ตามทฤษฎีนี้ปัญหาความน่าจะเป็นในโปรแกรมสามารถรับรู้ได้
ตัวอย่าง: แบบสุ่มสร้างจำนวนเต็มที่สร้าง 1 ด้วยโอกาส 55%, 2 ที่มีโอกาส 40% และ 3 ที่มีโอกาส 5% รหัสที่ใช้งานมีดังนี้:
การคัดลอกรหัสมีดังนี้:
int n5 = r.nextint (100);
int m; // หมายเลขผลลัพธ์
ถ้า (N5 <55) {// ช่วงเวลา 55 ตัวเลขโอกาส 55%
m = 1;
} อื่นถ้า (n5 <95) {// [55,95), ช่วงเวลา 40 ตัวเลข, 40% โอกาส
M = 2;
}อื่น{
M = 3;
-
เนื่องจากความน่าจะเป็นของแต่ละหมายเลขคือ 1%ความน่าจะเป็นของช่วงเวลา 55 หลักใด ๆ คือ 55% เพื่อความสะดวกในการเขียนรหัสจำนวนเต็มทั้งหมดในช่วงเวลา [0,55) ถูกนำมาใช้ที่นี่และหลักการที่ตามมาจะเหมือนกัน
แน่นอนรหัสที่นี่สามารถทำให้ง่ายขึ้นเนื่องจากอัตราต่อรองเป็นทวีคูณ 5%ดังนั้นเพียงควบคุมโอกาสตาม 5% ต่อไปนี้คือการใช้รหัสที่ง่ายขึ้น:
การคัดลอกรหัสมีดังนี้:
int n6 = r.nextint (20);
int m1;
ถ้า (n6 <11) {
M1 = 1;
} อื่นถ้า (n6 <19) {
M1 = 2;
}อื่น{
M1 = 3;
-
ภายในโปรแกรมตรรกะของความน่าจะเป็นสามารถนำไปใช้ตามคำแนะนำข้างต้น
4. ปัญหาอื่น ๆ
. ปัญหาของวัตถุสุ่มที่มีหมายเลขเมล็ดเดียวกัน
ดังที่ได้กล่าวไว้ก่อนหน้านี้วัตถุสุ่มที่มีจำนวนเมล็ดเดียวกันมีตัวเลขสุ่มที่สร้างขึ้นตามจำนวนครั้งเดียวกัน ต่อไปนี้เป็นรหัสทดสอบ:
การคัดลอกรหัสมีดังนี้:
สุ่ม R1 = ใหม่สุ่ม (10);
สุ่ม R2 = ใหม่สุ่ม (10);
สำหรับ (int i = 0; i <2; i ++) {
System.out.println (r1.nextint ());
System.out.println (r2.nextint ());
-
ในรหัสนี้จำนวนเมล็ดที่ใช้โดยวัตถุ R1 และ R2 คือ 10 ดังนั้นตัวเลขสุ่มที่สร้างขึ้นตามจำนวนครั้งเดียวกันจะเหมือนกัน
หากคุณต้องการหลีกเลี่ยงสถานการณ์ที่ตัวเลขแบบสุ่มเหมือนกันคุณต้องทราบว่าไม่ว่าคุณจะต้องสร้างตัวเลขสุ่มจำนวนเท่าใดในโครงการคุณสามารถใช้วัตถุสุ่มเพียงชิ้นเดียวเท่านั้น
ข. เกี่ยวกับวิธีการสุ่มในคลาสคณิตศาสตร์
ในความเป็นจริงยังมีวิธีการสุ่มในคลาสคณิตศาสตร์ งานของวิธีการสุ่มนี้คือการสร้างทศนิยมแบบสุ่มของช่วงเวลา [0, 1.0)
โดยการอ่านซอร์สโค้ดของคลาสคณิตศาสตร์เราสามารถพบว่าวิธีการสุ่มในคลาสคณิตศาสตร์ถูกนำมาใช้โดยการเรียกใช้วิธี NextDouble โดยตรงในคลาสสุ่ม
เป็นเพียงวิธีการสุ่มที่เรียกว่าค่อนข้างง่ายโปรแกรมโปรแกรมเมอร์จำนวนมากคุ้นเคยกับการใช้วิธีการสุ่มของคลาสคณิตศาสตร์เพื่อสร้างตัวเลขสุ่ม