ฉันมีสองคู่ดังต่อไปนี้
double min = 100;
double max = 101;
และด้วยตัวสร้างแบบสุ่มฉันต้องสร้างค่าสองเท่าระหว่างช่วงของ min และ max
Random r = new Random();
r.nextDouble();
แต่ไม่มีอะไรที่นี่ที่เราสามารถระบุช่วงได้
ฉันมีสองคู่ดังต่อไปนี้
double min = 100;
double max = 101;
และด้วยตัวสร้างแบบสุ่มฉันต้องสร้างค่าสองเท่าระหว่างช่วงของ min และ max
Random r = new Random();
r.nextDouble();
แต่ไม่มีอะไรที่นี่ที่เราสามารถระบุช่วงได้
คำตอบ:
วิธีสร้างค่าสุ่มระหว่างrangeMin
และrangeMax
:
Random r = new Random();
double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble();
rangeMin
และrangeMax
มีขนาดใหญ่อาจมี 10,000 ค่าที่แตกต่างกันระหว่างพวกเขา ผลลัพธ์ของการ(rangeMax - rangeMin) * r.nextDouble()
เลือกระหว่าง 10,000 ถึง 10,000,000 ค่าเท่านั้น (ฉันรู้สึกว่านี่ไม่ใช่คำอธิบายที่สมบูรณ์แบบ แต่บางทีมันอาจช่วยนิด ๆ หน่อย ๆ ... )
คำถามนี้ถูกถามก่อนปล่อย Java 7 แต่ตอนนี้มีอีกวิธีที่เป็นไปได้โดยใช้ Java 7 (และสูงกว่า) API:
double random = ThreadLocalRandom.current().nextDouble(min, max);
nextDouble
จะส่งคืนค่า pseudorandom สองค่าระหว่างค่าต่ำสุด (รวม) และสูงสุด (พิเศษ) ขอบเขตไม่จำเป็นต้องมีและสามารถint
double
ใช้สิ่งนี้:
double start = 400;
double end = 402;
double random = new Random().nextDouble();
double result = start + (random * (end - start));
System.out.println(result);
แก้ไข:
new Random().nextDouble()
: สุ่มสร้างตัวเลขระหว่าง 0 ถึง 1
start
: หมายเลขเริ่มต้นเพื่อย้ายหมายเลข "ไปทางขวา"
end - start
: ช่วงเวลา การสุ่มให้คุณจาก 0% ถึง 100% ของตัวเลขนี้เนื่องจากการสุ่มให้ตัวเลขจาก 0 ถึง 1
แก้ไข 2: Tks @daniel และ @aaa bbb คำตอบแรกของฉันผิด
import java.util.Random;
public class MyClass {
public static void main(String args[]) {
Double min = 0.0; // Set To Your Desired Min Value
Double max = 10.0; // Set To Your Desired Max Value
double x = (Math.random() * ((max - min) + 1)) + min; // This Will Create A Random Number Inbetween Your Min And Max.
double xrounded = Math.round(x * 100.0) / 100.0; // Creates Answer To The Nearest 100 th, You Can Modify This To Change How It Rounds.
System.out.println(xrounded); // This Will Now Print Out The Rounded, Random Number.
}
}
Random random = new Random();
double percent = 10.0; //10.0%
if (random.nextDouble() * 100D < percent) {
//do
}
แนวคิดหลักของการสุ่มคือมันส่งคืนค่าหลอกเทียม ไม่มีสิ่งเช่นฟังก์ชั่นสุ่มเต็มรูปแบบดังนั้น 2 กรณีสุ่มโดยใช้เมล็ดเดียวกันจะส่งกลับค่าเดียวกันในเงื่อนไขที่แน่นอน
เป็นวิธีปฏิบัติที่ดีในการดูเอกสารฟังก์ชันก่อนเพื่อให้เข้าใจ ( https://docs.oracle.com/javase/8/docs/api/java/util/Random.html )
ตอนนี้เราเข้าใจแล้วว่าค่าที่ส่งคืนของฟังก์ชัน nextDouble () เป็นค่าหลอกเทียมระหว่าง 0.0 ถึง 1.0 เราสามารถใช้มันเพื่อประโยชน์ของเรา
สำหรับการสร้างตัวเลขสุ่มระหว่าง A และ B givin 'ว่าขอบเขตนั้นถูกต้อง (A> B) เราจำเป็นต้อง: 1. ค้นหาช่วงระหว่าง A และ B เพื่อให้เรารู้ว่ามี "ขั้นตอน" มากมายแค่ไหน 2. ใช้ฟังก์ชันสุ่มเพื่อกำหนดจำนวนขั้นตอนที่ต้องดำเนินการ (เนื่องจากค่าที่ส่งคืนอยู่ระหว่าง 0.0 ถึง 1.0 คุณสามารถคิดว่ามันเป็น "เลือกเปอร์เซ็นต์การเพิ่มแบบสุ่ม" 3. เพิ่มออฟเซ็ต
หลังจากนั้นคุณจะเห็นว่าม็อบนั้นให้วิธีที่ง่ายและธรรมดาที่สุดในความคิดของฉัน
double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble ();
doubleValue = Offset + (ช่วง) * (randomVal ระหว่าง 0.0-1.0)
double rangeMax= Double.MAX_VALUE;
และdouble rangeMin= -rangeMax;
คุณจะได้รับผลตอบแทนที่ไม่มีที่สิ้นสุดเสมอDouble.valueOf(rangeMax-rangeMin).isInfinite()
คุณอาจต้องการตรวจสอบ