Bir aralıkta rastgele bir çift oluşturun


143

Aşağıdaki gibi iki katına sahibim

double min = 100;
double max = 101;

ve rastgele bir jeneratörle, min ve maks aralığı arasında çift değer yaratmam gerekiyor.

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

ancak burada aralığı belirleyebileceğimiz hiçbir şey yok.

Yanıtlar:


237

rangeMinVe arasında rastgele bir değer üretmek için rangeMax:

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

21
Bu genellikle doğrudur, ancak sınırlarına dikkat edin. Eğer yaparsanız double rangeMax= Double.MAX_VALUE;ve double rangeMin= -rangeMax;karşılığında daima sonsuz bir değer elde edersiniz. Kontrol etmek isteyebilirsiniz Double.valueOf(rangeMax-rangeMin).isInfinite().
lre

Eğer bu aralık 0.0-1.0'dan büyükse, bunun sonuçlarının genellikle istenen aralıktaki birçok çift değeri hariç tutacağını unutmayın. İstenen aralık 0.0-1.0 aralığından daha fazla sayıda değer içeriyorsa, her biri için bir değer olmayacak ve asla üretilmeyecektir. (Güvercin deliği prensibine göre!). Bu nedenle Tunaki'nin çözümü daha iyi.
Lii

@Lii neden her biri için bir değer olmayacak?
Kartik Chugh

1
@ K_7: Örneğin, 0.0 ile 1.0 arasında 10.000 ayrı çift değer olduğunu söyleyin (gerçekte muhtemelen daha fazlası vardır). Ancak rangeMinve arasındaki aralık rangeMaxbüyükse, aralarında 10.000.000 ayrı çift değer olabilir. Bunun sonucu, (rangeMax - rangeMin) * r.nextDouble()bu olası 10.000.000 değerin yalnızca 10.000'i arasından seçim yapacaktır. (Bunun mükemmel bir açıklama olmadığını hissediyorum, ama belki biraz yardımcı olur ...)
Lii

1
Ah, anlıyorum. Temel olarak, sonlu değerler kümesi alabilen bir sayının çarpılması bu kümenin boyutunu değiştirmez.
Kartik Chugh

138

Bu soru Java 7 sürümünden önce sorulmuştur, ancak şimdi Java 7 (ve üstü) API'sini kullanmanın başka bir yolu daha vardır:

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

nextDoubleminimum (dahil) ile maksimum (hariç) arasında sahte bir çift değer döndürür. Sınırlar zorunlu değildir intve olabilir double.


6
call gerektirir api 21
Zar E Ahmer

2
@XarEAhmer API 21 nedir?
Abhijit Sarkar

Görünüşe göre Android'den bahsediyor.
Kartik Chugh

40

Bunu kullan:

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

DÜZENLE:

new Random().nextDouble(): rastgele 0 ile 1 arasında bir sayı oluşturur.

start: numarayı "sağa" kaydırmak için başlangıç ​​numarası

end - start: Aralık. Rastgele size bu sayının% 0 ila% 100'ünü verir, çünkü rastgele size 0'dan 1'e kadar bir sayı verir.


DÜZENLEME 2: Tks @daniel ve @aaa bbb. İlk cevabım yanlıştı.


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

Rastgele ana fikir, sahte bir değer döndürmesi. Tamamen rasgele işlevler diye bir şey yoktur, bu nedenle, aynı tohumu kullanan rastgele örnekler belirli koşullarda aynı değeri döndürür.

Anlamak için önce işlev belgesini görüntülemek iyi bir uygulamadır ( https://docs.oracle.com/javase/8/docs/api/java/util/Random.html )

Şimdi nextDouble () fonksiyonunun döndürülen değerinin 0.0 ile 1.0 arasında bir sahte değer olduğunu anladığımıza göre, bunu kendi yararımıza kullanabiliriz.

Sınırların geçerli olduğunu belirten A ve B arasında rastgele bir sayı oluşturmak için (A> B) şunları yapmamız gerekir: 1. A ve B arasındaki aralığı bulmak, böylece kaç tane "adım" a sahip olduğumuzu öğrenebiliriz. 2. kaç adım atacağınızı belirlemek için rastgele fonksiyonu kullanın (döndürülen değer 0.0 ile 1.0 arasında olduğundan "rastgele bir artış yüzdesi seçin" olarak düşünebilirsiniz. 3. ofseti ekleyin

Tüm bunlardan sonra, çetenin size bunu yapmanın en kolay ve en yaygın yolunu verdiğini görebilirsiniz.

çift ​​randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble ();

çift ​​RandomValue = Ofset + (Aralık) * (0.0-1.0 arasında randomVal)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.