สร้างคู่สุ่มในช่วง


143

ฉันมีสองคู่ดังต่อไปนี้

double min = 100;
double max = 101;

และด้วยตัวสร้างแบบสุ่มฉันต้องสร้างค่าสองเท่าระหว่างช่วงของ min และ max

Random r = new Random();
r.nextDouble();

แต่ไม่มีอะไรที่นี่ที่เราสามารถระบุช่วงได้

คำตอบ:


237

วิธีสร้างค่าสุ่มระหว่างrangeMinและrangeMax:

Random r = new Random();
double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble();

21
โดยทั่วไปจะถูกต้อง แต่ระวังข้อ จำกัด หากคุณทำdouble rangeMax= Double.MAX_VALUE;และdouble rangeMin= -rangeMax;คุณจะได้รับผลตอบแทนที่ไม่มีที่สิ้นสุดเสมอ Double.valueOf(rangeMax-rangeMin).isInfinite()คุณอาจต้องการตรวจสอบ
lre

โปรดทราบว่าผลลัพธ์ของสิ่งนี้มักจะยกเว้นค่าสองเท่าจำนวนมากในช่วงที่ต้องการหากช่วงนั้นมีค่ามากกว่า 0.0-1.0 หากช่วงที่ต้องการมีจำนวนค่ามากกว่าช่วง 0.0-1.0 จะไม่มีค่าสำหรับแต่ละค่าและจะไม่ถูกสร้างขึ้น (ตามหลักการของนกพิราบ!) เพราะการแก้ปัญหาของ Tunakiนี้ดีกว่า
Lii

@Lii จะไม่มีค่าสำหรับแต่ละคนทำไมไม่
Kartik Chugh

1
@ K_7: พูดเช่นว่ามี 10,000 ค่าคู่ที่แตกต่างระหว่าง 0.0 ถึง 1.0 (ในความเป็นจริงอาจมีมากกว่านั้น) แต่ถ้าช่วงระหว่างrangeMinและrangeMaxมีขนาดใหญ่อาจมี 10,000 ค่าที่แตกต่างกันระหว่างพวกเขา ผลลัพธ์ของการ(rangeMax - rangeMin) * r.nextDouble()เลือกระหว่าง 10,000 ถึง 10,000,000 ค่าเท่านั้น (ฉันรู้สึกว่านี่ไม่ใช่คำอธิบายที่สมบูรณ์แบบ แต่บางทีมันอาจช่วยนิด ๆ หน่อย ๆ ... )
Lii

1
ฉันเข้าใจแล้ว โดยพื้นฐานแล้วการคูณจำนวนที่สามารถนำชุดค่าที่แน่นอนมาใช้ได้จะไม่เปลี่ยนขนาดของชุดนั้น
Kartik Chugh

138

คำถามนี้ถูกถามก่อนปล่อย Java 7 แต่ตอนนี้มีอีกวิธีที่เป็นไปได้โดยใช้ Java 7 (และสูงกว่า) API:

double random = ThreadLocalRandom.current().nextDouble(min, max);

nextDoubleจะส่งคืนค่า pseudorandom สองค่าระหว่างค่าต่ำสุด (รวม) และสูงสุด (พิเศษ) ขอบเขตไม่จำเป็นต้องมีและสามารถintdouble


6
call ต้องการ api 21
Zar E Ahmer

2
@XarEAhmer API 21 คืออะไร
Abhijit Sarkar

ดูเหมือนว่าเขาจะอ้างถึง Android
Kartik Chugh

40

ใช้สิ่งนี้:

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 คำตอบแรกของฉันผิด


4
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.
     }
}


0

แนวคิดหลักของการสุ่มคือมันส่งคืนค่าหลอกเทียม ไม่มีสิ่งเช่นฟังก์ชั่นสุ่มเต็มรูปแบบดังนั้น 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)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.