Hasilkan dobel acak dalam rentang


143

Saya memiliki dua ganda seperti berikut ini

double min = 100;
double max = 101;

dan dengan generator acak, saya harus membuat nilai ganda antara kisaran min dan maks.

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

tetapi tidak ada apa pun di sini tempat kami dapat menentukan rentang.

Jawaban:


237

Untuk menghasilkan nilai acak antara rangeMindan rangeMax:

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

21
Ini umumnya benar, tetapi waspadai batasannya. Jika Anda melakukannya double rangeMax= Double.MAX_VALUE;dan double rangeMin= -rangeMax;Anda akan selalu mendapatkan nilai tak terbatas sebagai imbalan. Anda mungkin ingin memeriksa Double.valueOf(rangeMax-rangeMin).isInfinite().
lre

Perhatikan bahwa hasil ini akan sering mengecualikan banyak nilai ganda dalam rentang yang diinginkan, jika rentang itu lebih besar dari 0,0-1,0. Jika rentang yang diinginkan berisi jumlah nilai yang lebih besar dari kisaran 0,0-1,0 maka tidak akan ada nilai untuk masing-masing dan mereka tidak akan pernah dihasilkan. (Dengan prinsip pigeonhole!). Karena solusi Tunaki ini lebih baik.
Lii

@ Lii tidak akan ada nilai untuk masing-masing mengapa tidak?
Kartik Chugh

1
@ K_7: Katakan misalnya bahwa ada 10.000 nilai ganda yang berbeda antara 0,0 dan 1,0 (pada kenyataannya mungkin ada lebih banyak). Tetapi jika rentang antara rangeMindan rangeMaxbesar, maka mungkin ada 10.000.000 nilai ganda yang berbeda di antara mereka. Hasilnya (rangeMax - rangeMin) * r.nextDouble()hanya akan memilih antara 10.000 dari nilai yang mungkin 10.000.000. (Saya merasa ini bukan penjelasan yang sempurna, tapi mungkin ini membantu sedikit ...)
Lii

1
Ah saya mengerti. Pada dasarnya, mengalikan angka yang dapat mengambil set nilai terbatas tidak mengubah ukuran set itu.
Kartik Chugh

138

Pertanyaan ini ditanyakan sebelum rilis Java 7 tetapi sekarang, ada cara lain yang memungkinkan menggunakan Java 7 (dan di atas) API:

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

nextDoubleakan mengembalikan nilai ganda pseudorandom antara minimum (inklusif) dan maksimum (eksklusif). Batas belum tentu int, dan bisa double.


6
panggilan membutuhkan api 21
Zar E Ahmer

2
@XarEAhmer Apa API 21?
Abhijit Sarkar

Sepertinya dia merujuk ke Android.
Kartik Chugh

40

Gunakan ini:

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

EDIT:

new Random().nextDouble(): secara acak menghasilkan angka antara 0 dan 1.

start: nomor mulai, untuk menggeser angka "ke kanan"

end - start: interval. Random memberi Anda dari 0% hingga 100% dari angka ini, karena acak memberi Anda angka dari 0 hingga 1.


EDIT 2: Tks @daniel dan @aaa bbb. Jawaban pertama saya salah.


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

Gagasan utama acak adalah mengembalikan nilai pseudorandom. Tidak ada yang namanya fungsi acak penuh, karenanya, 2 instance acak menggunakan seed yang sama akan mengembalikan nilai yang sama dalam kondisi tertentu.

Ini adalah praktik yang baik untuk terlebih dahulu melihat fungsi doc untuk memahaminya ( https://docs.oracle.com/javase/8/docs/api/java/util/Random.html )

Sekarang kita mengerti bahwa nilai yang dikembalikan dari fungsi nextDouble () adalah nilai pseudorandom antara 0,0 dan 1,0 kita dapat menggunakannya untuk keuntungan kita.

Untuk membuat angka acak antara A dan B memberikan bahwa batas-batasnya valid (A> B) kita perlu: 1. menemukan rentang antara A dan B sehingga kita bisa tahu bagaimana banyak "langkah" yang kita miliki. 2. gunakan fungsi acak untuk menentukan berapa banyak langkah yang harus diambil (karena nilai yang dikembalikan adalah antara 0,0 dan 1,0 Anda dapat menganggapnya sebagai "pilih persentase kenaikan acak" 3. tambahkan offset

Setelah semua itu, Anda dapat melihat bahwa massa memberi Anda cara termudah dan paling umum untuk melakukannya menurut saya

double RandomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble ();

double RandomValue = Offset + (Range) * (randomVal antara 0.0-1.0)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.