บทนี้จะอธิบายหลายวิธีในการสร้างตัวเลขสุ่ม Java จากนั้นแสดงให้เห็นผ่านตัวอย่าง
การพูดในวงกว้างมีสามวิธีในการสร้างตัวเลขสุ่มใน Java:
(01) ใช้ System.currentTimeMillis () เพื่อรับจำนวนมิลลิวินาทีของเวลาปัจจุบัน
(02) ส่งคืนค่าสองเท่าระหว่าง 0 และ 1 ผ่านทาง Math.random ()
(03) สร้างหมายเลขสุ่มผ่านคลาสสุ่ม นี่คือคลาสเครื่องมือแบบสุ่มแบบมืออาชีพที่มีฟังก์ชั่นที่ทรงพลัง วิธีแรกใช้ System.currentTimeMillis () เพื่อรับตัวเลขสุ่ม
รับหมายเลขสุ่มผ่าน System.currentTimeMillis () จริง ๆ แล้วมันได้รับหมายเลขมิลลิวินาทีปัจจุบันซึ่งมีความยาวประเภท วิธีใช้เป็นดังนี้:
Long Long สุดท้าย L = System.currentTimeMillis ();
หากต้องการรับจำนวนเต็มประเภท int เพียงแปลงผลลัพธ์ด้านบนเป็นพิมพ์ int ตัวอย่างเช่นรับจำนวนเต็ม int ระหว่าง [0, 100) วิธีนี้มีดังนี้:
Long Long สุดท้าย L = System.currentTimeMillis (); int สุดท้าย i = (int) (l % 100);
วิธีที่สองใช้ math.random () เพื่อรับตัวเลขสุ่ม
รับตัวเลขสุ่มผ่าน Math.random () ในความเป็นจริงมันส่งคืนค่าสองเท่าระหว่าง 0 (รวม) และ 1 (ไม่รวม) วิธีใช้เป็นดังนี้:
double double d = math.random ();
หากต้องการรับจำนวนเต็มประเภท int เพียงแปลงผลลัพธ์ด้านบนเป็นพิมพ์ int ตัวอย่างเช่นรับจำนวนเต็ม int ระหว่าง [0, 100) วิธีนี้มีดังนี้:
double double d = math.random (); int สุดท้าย i = (int) (d*100);
ประเภทที่สามใช้คลาสสุ่มเพื่อรับตัวเลขสุ่ม
รับตัวเลขสุ่มผ่านคลาสสุ่ม
วิธีใช้เป็นดังนี้:
(01) สร้างวัตถุสุ่ม มีสองวิธีในการสร้างวัตถุสุ่มดังนี้:
Random Random = new Random (); // ค่าเริ่มต้นของ Constructor Random Random = new Random (1000); // ระบุหมายเลขเมล็ด
(02) รับตัวเลขสุ่มผ่านวัตถุสุ่ม แบบสุ่มรองรับประเภทค่าสุ่ม: บูลีน, ไบต์, int, ยาว, ลอย, สองเท่า
ตัวอย่างเช่นรับจำนวนเต็ม int ระหว่าง [0, 100) วิธีนี้มีดังนี้:
int i2 = random.nextint (100);
อินเตอร์เฟสฟังก์ชั่นของสุ่ม
// constructor (i): สร้างเครื่องกำเนิดหมายเลขสุ่มใหม่ Random () // constructor (ii): สร้างเครื่องกำเนิดหมายเลขสุ่มใหม่โดยใช้เมล็ดยาวเดียว: สุ่มสาธารณะ (เมล็ดยาว) {setseed (เมล็ด); } วิธีต่อไปใช้เพื่อบันทึกสถานะของเครื่องกำเนิดหมายเลขสุ่ม สุ่ม (เมล็ดยาว) บูลีน NextBoolean () // ส่งคืนหมายเลข "บูลีนประเภท" ถัดไป " ถือเป็นโมฆะ nextbytes (byte [] buf) // สร้างไบต์สุ่มและวางไว้ใน byte array buf double nextdouble () // ส่งคืนจำนวนสุ่มของ "สองประเภทระหว่าง [0.0, 1.0)" ลอย nextfloat () // ส่งคืนจำนวนสุ่มของ "ประเภทลอยระหว่าง [0.0, 1.0)" int nextint () // ส่งคืนหมายเลขสุ่ม "ประเภท int" ถัดไป int nextint (int n) // ส่งคืนจำนวนสุ่มของ "ประเภท int ระหว่าง [0, n)" ยาวถัดไป () // ส่งคืนหมายเลขสุ่ม "ประเภทยาว" ถัดไป ซิงโครไนซ์ double nextgaussian () // ส่งคืนหมายเลขสุ่ม "สองประเภท" ถัดไปซึ่งเป็นค่าสองเท่าในการแจกแจงแบบเกาส์ ("ปกติ") โดยมีค่าเฉลี่ย 0.0 และค่าเบี่ยงเบนมาตรฐาน 1.0 โมฆะที่ซิงโครไนซ์ setseed (เมล็ดยาว) // ตั้งค่าเมล็ดของเครื่องกำเนิดตัวเลขสุ่มนี้โดยใช้เมล็ดยาวเดี่ยวรับตัวอย่างหมายเลขสุ่ม
EG1:
ต่อไปนี้เป็นตัวอย่างที่จะแสดงให้เห็นถึงสามวิธีข้างต้นเพื่อรับตัวเลขสุ่ม ซอร์สโค้ดมีดังนี้ (randomtest.java):
นำเข้า java.util.random; นำเข้า Java.lang.math;/*** โปรแกรมการทดสอบหมายเลขสุ่ม Java มี 3 วิธีในการรับตัวเลขสุ่ม: * (01), ใช้ System.currentTimeMillis () เพื่อให้ได้จำนวนมิลลิวินาทีในระยะยาวในเวลาปัจจุบัน * (02), ส่งคืนค่าสองเท่าระหว่าง 0 และ 1 ผ่านทางคณิตศาสตร์ random () * (03) สร้างหมายเลขสุ่มผ่านคลาสสุ่ม นี่คือคลาสเครื่องมือแบบสุ่มแบบมืออาชีพที่มีฟังก์ชั่นที่ทรงพลัง * * @author Skywang * @email [email protected] */คลาสสาธารณะแบบสุ่ม {โมฆะคงที่สาธารณะหลัก (สตริง args []) {// ส่งคืนหมายเลข testsystemTimeMillis () ผ่านระบบปัจจุบันของระบบ (); // ส่งคืนหมายเลขสุ่ม testmathrandom () ผ่านการสุ่มของคณิตศาสตร์ (); // สร้างวัตถุสุ่มใหม่ด้วย "เมล็ดพันธุ์ 1,000" และทดสอบ API แบบสุ่มผ่านเมล็ด testrandomapis นี้ (สุ่มใหม่ (1,000), "การสุ่มครั้งที่ 1 (1,000)"); TestRandomapis (สุ่มใหม่ (1,000), "การสุ่มที่ 2 (1,000)"); // สร้างวัตถุสุ่ม "เมล็ดพันธุ์เริ่มต้น" และทดสอบ API ของการสุ่มผ่านการทดสอบเมล็ดพันธุ์นี้ (ใหม่สุ่ม (), "การสุ่มครั้งที่ 1 ()"); TestRandomapis (ใหม่สุ่ม (), "2nd Random ()"); } / ** * ส่งคืนหมายเลขสุ่ม -01: CurrentTimeMillis () * / โมฆะเป็นโมฆะแบบคงที่ส่วนตัว TestSystemTimeMillis () {// สุดท้าย L = System.currentTimeMillis (); // รับ [0, จำนวนเต็มสุดท้าย int i = (int) (l % 100); System.out.printf ("/n ---- system.currenttimeMillis () ---/nl =%si =%s/n", l, i); } / ** * ส่งคืนหมายเลขสุ่ม -02: การทดสอบคณิตศาสตร์ของการสุ่ม () * / โมฆะแบบคงที่ส่วนตัว testmathrandom () {// ส่งคืนหมายเลขสุ่มสองประเภทผ่านฟังก์ชั่นสุ่มของคณิตศาสตร์ (0.0, 1.0) double d = math.random (); // รับจำนวนเต็มระหว่าง [0, 100) int สุดท้าย i = (int) (d*100); System.out.printf ("/n ----- math.random () ---/nd =%si =%s/n", d, i); } / ** * ส่งคืนหมายเลขสุ่ม -03: ทดสอบ API ของการสุ่ม * / โมฆะแบบคงที่ส่วนตัว TestRandomapis (สุ่มสุ่มชื่อสตริง) {สุดท้าย int buffer_len = 5; // รับบูลีนบูลีนแบบสุ่ม b = random.nextboolean (); // รับอาร์เรย์แบบสุ่ม buf [] byte [] buf = byte ใหม่ [buffer_len]; Random.nextbytes (buf); // รับค่าคู่แบบสุ่มช่วง [0.0, 1.0) double d = random.nextdouble (); // รับค่าลอยแบบสุ่มช่วง [0.0, 1.0) ลอย f = random.nextfloat (); // รับค่า int สุ่ม int i1 = random.nextint (); // รับค่า int สุ่มระหว่าง [0,100) int i2 = random.nextint (100); // รับการแจกแจงแบบเกาส์แบบสุ่ม double g = random.nextgaussian (); // รับความยาวแบบสุ่มยาว l = random.nextlong (); System.out.printf ("/n ---%s ----/nb =%s, d =%s, f =%s, i1 =%s, i2 =%s, g =%s, l =%s, buf = [", ชื่อ, b, d, f, i1, i2, g, l); สำหรับ (btte bt: buf) system.out.printf ("%s,", bt); System.out.println ("]"); -
EG2:
ปัญหา: สร้างตัวเลขสุ่มระหว่าง (-10,10) โดยมีสองหลักเก็บไว้หลังจากจุดทศนิยม
สารละลาย:
1. ฟังก์ชั่นการสร้างตัวเลขแบบสุ่มสุ่ม r = new random (); r.nextfloat (); // สร้างตัวเลขสุ่มจุดลอยตัวระหว่าง (0,1) คูณหมายเลขสุ่มข้างบน 10 เพื่อรับหมายเลขสุ่มระหว่าง (0,10)
2. สร้างจำนวนสุ่มประเภทบูลีนเพื่อควบคุมค่าบวกและลบของจำนวน: R.Nextboolean ();
3. วิธีการรักษาสองตำแหน่งทศนิยม: Math.Floor (N*100+0.5)/100; หมายเลขที่ได้รับเป็นสองประเภท
รหัสมีดังนี้:
นำเข้า Java.util.*; createrandom คลาสสาธารณะ {สาธารณะลอย numrandom () {ลอยจำนวน; สุ่ม r = ใหม่สุ่ม (); ค่าลอย = (ลอย) (คณิตศาสตร์ floor (r.nextfloat ()*1000+0.5)/100); บูลีน b = r.nextboolean (); if (b) {num = value; } else {num = 0-value; } return num; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {createrandom cr = createrandom ใหม่ (); float num = cr.numrandom (); System.out.print (NUM); -