Tạo một số ngẫu nhiên trong một phạm vi


143

Tôi có hai nhân đôi như sau

double min = 100;
double max = 101;

và với một trình tạo ngẫu nhiên, tôi cần tạo một giá trị kép giữa phạm vi tối thiểu và tối đa.

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

nhưng không có gì ở đây nơi chúng ta có thể chỉ định phạm vi.

Câu trả lời:


237

Để tạo một giá trị ngẫu nhiên giữa rangeMinrangeMax:

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

21
Điều này nói chung là chính xác, nhưng hãy cẩn thận với giới hạn của nó. Nếu bạn làm double rangeMax= Double.MAX_VALUE;double rangeMin= -rangeMax;bạn sẽ luôn nhận được một giá trị vô hạn. Bạn có thể muốn kiểm tra Double.valueOf(rangeMax-rangeMin).isInfinite().
LRE

Lưu ý rằng kết quả của điều này thường sẽ loại trừ nhiều giá trị kép trong phạm vi mong muốn, nếu phạm vi đó lớn hơn 0,0-1. Nếu phạm vi mong muốn chứa số lượng giá trị lớn hơn phạm vi 0,0-1 thì sẽ không có giá trị cho mỗi phạm vi và chúng sẽ không bao giờ được tạo. (Theo nguyên tắc pigeonhole!). Bởi vì giải pháp này của Tunaki là tốt hơn.
Lii

@Lii sẽ không có giá trị cho mỗi người tại sao không?
Kartik Chugh

1
@ K_7: Ví dụ: có 10.000 giá trị kép khác nhau giữa 0,0 và 1,0 (trong thực tế có thể có nhiều hơn). Nhưng nếu phạm vi giữa rangeMinrangeMaxlớn, thì có thể có 10.000.000 giá trị kép khác nhau giữa chúng. Kết quả (rangeMax - rangeMin) * r.nextDouble()sẽ chỉ chọn giữa 10.000 trong số 10.000.000 giá trị có thể đó. (Tôi cảm thấy rằng đây không phải là một lời giải thích hoàn hảo, nhưng có lẽ nó sẽ giúp một chút ...)
Lii

1
Ah tôi thấy. Về cơ bản, nhân một số có thể lấy một bộ giá trị hữu hạn sẽ không làm thay đổi kích thước của bộ đó.
Kartik Chugh

138

Câu hỏi này đã được hỏi trước khi phát hành Java 7 nhưng bây giờ, có một cách khác có thể sử dụng API Java 7 (và ở trên):

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

nextDoublesẽ trả về giá trị gấp đôi giả ngẫu nhiên giữa mức tối thiểu (bao gồm) và tối đa (độc quyền). Các giới hạn không nhất thiết int, và có thể double.


6
cuộc gọi yêu cầu api 21
Zar E Ahmer

2
@XarEAHmer API 21 là gì?
Abhijit Sarkar

Có vẻ như anh ấy đang đề cập đến Android.
Kartik Chugh

40

Dùng cái này:

double start = 400;
double end = 402;
double random = new Random().nextDouble();
double result = start + (random * (end - start));
System.out.println(result);

BIÊN TẬP:

new Random().nextDouble(): tạo ngẫu nhiên một số từ 0 đến 1.

start: số bắt đầu, để chuyển số "sang phải"

end - start: khoảng. Random cung cấp cho bạn từ 0% đến 100% số này, bởi vì Random cung cấp cho bạn một số từ 0 đến 1.


EDIT 2: Tks @daniel và @aaa bbb. Câu trả lời đầu tiên của tôi là sai.


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
Random random = new Random();
double percent = 10.0; //10.0%
if (random.nextDouble() * 100D < percent) {
    //do
}

0

Ý tưởng chính của ngẫu nhiên là nó trả về giá trị giả ngẫu nhiên. Không có thứ gọi là các hàm hoàn toàn ngẫu nhiên, do đó, 2 trường hợp ngẫu nhiên sử dụng cùng một hạt giống sẽ trả về cùng một giá trị trong các điều kiện nhất định.

Đó là một cách thực hành tốt để xem tài liệu chức năng trước tiên để hiểu về nó ( https://docs.oracle.com/javase/8/docs/api/java/util/Random.html )

Bây giờ chúng tôi hiểu rằng giá trị được trả về của hàm nextDouble () là giá trị giả ngẫu nhiên giữa 0,0 và 1,0, chúng tôi có thể sử dụng nó để làm lợi thế cho chúng tôi.

Để tạo một số ngẫu nhiên giữa A và B givin ', các ranh giới là hợp lệ (A> B), chúng ta cần phải: 1. tìm phạm vi giữa A và B để chúng ta có thể biết cách thực hiện nhiều "bước". 2. sử dụng hàm ngẫu nhiên để xác định có bao nhiêu bước cần thực hiện (vì giá trị được trả về nằm trong khoảng từ 0,0 đến 1, bạn có thể nghĩ đó là "chọn phần trăm tăng ngẫu nhiên" 3. thêm phần bù

Sau tất cả những điều đó, bạn có thể thấy mob đã cho bạn cách dễ nhất và phổ biến nhất theo quan điểm của tôi

double RandomValue = RangeMin + (RangeMax - RangeMin) * r.nextDouble ();

double RandomValue = Offset + (Phạm vi) * (RandomVal trong khoảng 0,0-1,0)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.