Java'daki Math.random () ile rastgele sayılar

Rasgele sayılar oluşturmak için aşağıdaki formülü kullandım:

(int) (Math.random() * maks) + min

Google’da bulduğum formül her zaman şöyle görünüyor:

(int) (Math.random() * (maks - dk.) + min)

Hangisi doğru? Bildiğim kadarıyla, formülümle menzilimin dışında bir sayı elde etmedim.

12
Eminim, kolay puan arayan yarım düzine cevaplar, sayfayı yenilediğimde, sizinki yanlıştır. max kodunuz gerçekten aralık veya width olarak adlandırılmalıdır.
katma yazar BlueRaja - Danny Pflughoeft, kaynak
Şanslı bir adam gibi görünüyorsun.
katma yazar WannaBeCoder, kaynak

11 cevap

Formülünüz min ve min + max arasında sayı üretir.

Bulunan bir Google, minimum ile maks.

Google kazanır!

14
katma
Tamlığı sağlamak için, 'tamamla' derken, min ve max hariç tutmayı mı kastediyorsunuz?
katma yazar Maarten, kaynak

Daha iyi bir yaklaşım:

int x = rand.nextInt(max - min + 1) + min;

Formülünüz min ve min + max arasındaki sayıları üretir.

Random random = new Random(1234567);
int min = 5;
int max = 20;
while (true) {
    int x = (int)(Math.random() * max) + min;
    System.out.println(x);
    if (x < min || x >= max) { break; }
}       

Sonuç:

10
16
13
21//Oops!!

See it online here: ideone

8
katma

Sizinki: Mümkün olan en düşük, en yüksek, en yüksek, maksimum + min-1

Google: Mümkün olan en düşük, en yüksek, en yüksek olası maksimum-1

5
katma
Math.random() geri dönmez 1
katma yazar Alex, kaynak
Bu doğru. Böylece -1.
katma yazar F.J, kaynak

min = 10 ve max = 100 ise:

(int)(Math.random() * max) + min        

10 ile 110 arasında bir sonuç verirken

(int)(Math.random() * (max - min) + min)

10 ile 100 arasında bir sonuç verir, bu yüzden çok farklı formüllerdir . Burada önemli olan netliktir, ne yaparsanız yapın, kodun neyin üretildiğini netleştirdiğinden emin olun.

(PS. 'İlk' değişkeni 'aralık' olarak değiştirirseniz ilk önce daha anlamlı olur)

2
katma

Birincisi yanlış aralıkta sayı üretirken, ikincisi doğrudur.

Birincisinin yanlış olduğunu göstermek için min 10 ve max 20 diyelim. Diğer bir deyişle, sonucun on'dan büyük veya ona eşit olması bekleniyor. ve kesinlikle yirmiden az. Math.random() , 0.75 değerini döndürürse, ilk formülün sonucu 25 olup, aralığın dışındadır.

2
katma
int i = (int) (10 +Math.random()*11);

Bu size 10 ila 20 arasında rastgele sayı verecektir.

Buradaki anahtar:

a + Math.random()*b

bir başlangıç ​​num (10) ve sonlama sayısı maksimum sayıdır (20) - a (10) + 1 (11)

Keyfini çıkarın!

2
katma
Merhaba Jason, Math.random için Javadoc'a bakarak, bir çift> = 0.0, ancak <1.0 döndürür. Ondalık kesinlik olarak gösterildiği gibi (ondalık), (10 + Math.random() * 11 değerleri 10..19, değil, 20 aralığındadır. [Math.random() 'unun maksimum değeri 0.9'dır. 0.9 * 11 = 9.9 10 + 9.9 = 19.9 Döküm int 19'a indirir çünkü 19.9 değerini yuvarlar, yuvarlamaz (Math.round (double_val) bu durumda 20 uzun bir değer döndürür). 10..20 aralığı yerine, bunun yerine ihtiyacınız var: int i = (int) (10 + Math.random() * 12), siz veya başka birinin yanlış olduğunu düşünüyorsanız, yorum yapmaktan çekinmeyin.
katma yazar Matt Campbell, kaynak

Math.random()

     

Pozitif işaretli, büyük veya eşit bir çift değer döndürür   0,0 ve 1,0'dan küçük.

Şimdi ne yapmak istediğinize bağlı. Örneğin 1'den 100'e kadar sayıları istediğinizde, sadece eklemek zorundasınız.

(int)(Math.random()*100)

Yani 100 değerler aralığıdır. Aralığın başlangıcını 20 ila 120 arasında değiştirmek istediğinizde, sonuna +20 eklemeniz gerekir.

Yani formül:

(int)(Math.random()*range) + min

Ve her zaman aralığı max-min ile hesaplayabilirsiniz, bu yüzden Google size bu formülü verir.

1
katma

min = 5 ve max = 10 ve Math.random() (neredeyse) 1.0 döndürürse, oluşturulan sayı (neredeyse ) 15, açıkça, seçilen max 'den daha fazladır.

Benzer şekilde, her bir rasgele sayı API'sinin min ve max'ı açıkça belirtmenize izin vermesinin nedeni budur. Sorun alanınıza teğet olan hata eğilimli matematikler yazmanız gerekmemelidir.

1
katma
@ F.J Doğruluk uğruna "neredeyse" ekledim; Ben 1.0 seçtim çünkü tamsayılarla bir örneği anlamak daha kolay.
katma yazar millimoose, kaynak
Math.random() her zaman 1.0'dan daha düşüktür.
katma yazar F.J, kaynak

Google doğru :-)

Google's formula creates numbers between: min and max Your formula creates numbers between: min and (min+max)

1
katma

Math.random() generates a number between 0 (inclusive) and 1 (exclusive).

Yani (int) (Math.random() * max) 0 ile max-1 arasında değişir.

Sonra (int) (Math.random() * max) + min min ile max + min - 1 arasında değişir. İstediğiniz.

Google'ın formülü doğru.

0
katma

Google'da bulduğunuz formülle ilgili küçük bir sorun var. (int) olmalıdır (Math.random() * (maks - dk + 1) + min) değil (int) (Math.random() * (maks - min) + min) .

0
katma