Math.random () açıklaması


133

Bu oldukça basit bir Java (muhtemelen tüm programlama için geçerli olsa da) sorusu:

Math.random() sıfır ile bir arasında bir sayı döndürür.

Sıfır ile yüz arasında bir tamsayı döndürmek isterseniz, yapardım:

(int) Math.floor(Math.random() * 101)

Bir ile yüz arasında yapardım:

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

Ama üç ile beş arasında bir sayı almak istersem ne olur? Aşağıdaki ifade gibi olacak mı:

(int) Math.random() * 5 + 3

Bilmem nextInt()içinde java.lang.util.Random. Ama bununla nasıl yapılacağını öğrenmek istiyorum Math.random().


[3,5] için:(int)Math.floor(Math.random()*3) + 3
good_evening

9
BTW: aralık 0,0 dahil - 1,0 özel (hiç 1.0 kazanamazsınız) nextInt () kullanmak çok daha iyi bir seçimdir, sadece daha basit değil, aynı zamanda daha hızlıdır.
Peter Lawrey

2
Kullanmak Math.ceilyanlış, Math.random()döndürdüğünde yanlış sonuç verir 0.
starblue

Math.floor 0.029 döndürürse ne olur? Her zaman tek bir ifadeyle iki basamaklı bir sayı nasıl elde edilir?
Naisheel Verdhan

Yanıtlar:


165
int randomWithRange(int min, int max)
{
   int range = (max - min) + 1;     
   return (int)(Math.random() * range) + min;
}

Çıktı randomWithRange(2, 5)10 kez:

5
2
3
3
2
4
4
4
5
4

Sınırlar kapsayıcıdır, yani [2,5] ve yukarıdaki örnekten mindaha az olmalıdır max.

DÜZENLEME: Birisi denemek ve aptal olmak ve ters gittiğini ise minve max, kodu için değişebilir:

int randomWithRange(int min, int max)
{
   int range = Math.abs(max - min) + 1;     
   return (int)(Math.random() * range) + (min <= max ? min : max);
}

EDIT2:double s hakkındaki sorunuz için :

double randomWithRange(double min, double max)
{
   double range = (max - min);     
   return (Math.random() * range) + min;
}

Ve yine aptalca kanıtlamak istiyorsanız, sadece:

double randomWithRange(double min, double max)
{
   double range = Math.abs(max - min);     
   return (Math.random() * range) + (min <= max ? min : max);
}

1
Kullanmazsanız (int)ve bir iade etmesini isterseniz ne olur double?
switz

Çifte istiyorsanız ints'yi s ile değiştirin double(ve typecast gerekli değildir). İstediğini sanmıştım intama yazıma ekleyeceğim.
AusCBloke

2
Aslında doubles ile + 1de Math.random()kesilmiş değil çünkü kaldırın . Bununla birlikte, aralık Math.random" min, maks ." Olacaktır. "Pozitif işaretli, 0.0'dan büyük veya eşit ve 1.0'dan küçük bir çift değer döndürür." maxMümkün olsa bile , sayının tam olarak olma ihtimali çok az olurdu .
AusCBloke

44

0 ile 100 arasında bir sayı oluşturmak istiyorsanız, kodunuz şöyle görünür:

(int)(Math.random() * 101);

10'dan 20'ye kadar bir sayı oluşturmak için:

(int)(Math.random() * 11 + 10);

Genel durumda:

(int)(Math.random() * ((upperbound - lowerbound) + 1) + lowerbound);

( lowerboundkapsayıcı ve upperboundmünhasırdır).

Dahil edilmesi veya hariç tutulması upperboundseçiminize bağlıdır. Diyelim ki range = (upperbound - lowerbound) + 1o upperboundzaman kapsayıcı, ama o range = (upperbound - lowerbound)zaman upperboundmünhasır.

Örnek: 3-5 arasında bir tamsayı istiyorsanız, aralık (5-3) +1 ise, o zaman 5 kapsayıcıdır, ancak aralık sadece (5-3) ise, 5 özeldir.


2
upperboundözel? Bence kapsayıcı olacak.
vidit

1
@vidit özel

1
Büyük resimde elde ettiğinizi düşünmeyin, örnekte belirtildiği gibi
Teezy7

19

RandomBulunan Java sınıfı java.utilpaketinin amacınız daha iyi hizmet edecektir. nextInt()Bir tamsayı döndüren bazı yöntemleri vardır. İnt bağımsız değişkeni alan kişi 0 ile o int arasında bir sayı üretecektir;


Sorumu güncelledim, nasıl yapılacağını bilmek istiyorum Math.random(). Teşekkürler.
switz

1

10 ile 20 arasında bir sayı oluşturmak için şunu kullanabilirsiniz: java.util.Random

int myNumber = new Random().nextInt(11) + 10

0

İşte sınırları alan ve rastgele bir tamsayı döndüren bir yöntem. Biraz daha gelişmiş (tamamen evrensel): sınırlar hem pozitif hem de negatif olabilir ve minimum / maksimum sınırlar herhangi bir sırada gelebilir.

int myRand(int i_from, int i_to) {
  return (int)(Math.random() * (Math.abs(i_from - i_to) + 1)) + Math.min(i_from, i_to);
}

Genel olarak, sınırlar arasındaki mutlak mesafeyi bulur, ilgili rastgele değeri alır ve ardından cevabı alt kenarlığa göre kaydırır.

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.