Penjelasan Math.random ()

133

Ini adalah pertanyaan Java yang cukup sederhana (meskipun mungkin berlaku untuk semua pemrograman):

Math.random() mengembalikan angka antara nol dan satu.

Jika saya ingin mengembalikan bilangan bulat antara nol dan seratus, saya akan lakukan:

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

Antara satu dan seratus, saya akan melakukan:

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

Tetapi bagaimana jika saya ingin mendapatkan nomor antara tiga dan lima? Apakah akan seperti pernyataan berikut:

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

Aku tahu tentang nextInt()di java.lang.util.Random. Tapi saya ingin belajar bagaimana melakukan ini Math.random().

switz
sumber
Untuk [3,5]:(int)Math.floor(Math.random()*3) + 3
good_evening
9
BTW: rentangnya dari 0,0 inklusif hingga 1,0 eksklusif (Anda tidak akan sepenuhnya mendapatkan 1,0 sebelumnya) Menggunakan nextInt () adalah pilihan yang jauh lebih baik, tidak hanya lebih sederhana tetapi juga jauh lebih cepat.
Peter Lawrey
2
Menggunakan Math.ceilsalah, itu memberikan hasil yang salah saat Math.random()kembali 0.
starblue
Bagaimana jika Math.floor mengembalikan 0,029? Bagaimana cara mendapatkan nomor dua digit dengan satu pernyataan?
Naisheel Verdhan

Jawaban:

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

Output randomWithRange(2, 5)10 kali:

5
2
3
3
2
4
4
4
5
4

Batasannya inklusif, yaitu [2,5], dan minharus kurang dari maxpada contoh di atas.

EDIT: Jika seseorang akan mencoba menjadi bodoh dan mundur mindan max, Anda dapat mengubah kode menjadi:

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

EDIT2: Untuk pertanyaan Anda tentang doubles, hanya saja:

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

Dan lagi jika Anda ingin membodohinya, itu hanya:

double randomWithRange(double min, double max)
{
   double range = Math.abs(max - min);     
   return (Math.random() * range) + (min <= max ? min : max);
}
AusCBloke
sumber
1
Bagaimana jika Anda tidak menggunakan (int)dan ingin mengembalikan double?
switz
Jika Anda ingin menggandakan maka ganti saja intdengan doubles (dan typecast tidak perlu). Saya berasumsi Anda ingin inttetapi saya akan menambahkan ke posting saya.
AusCBloke
2
Sebenarnya dengan doubles hapus + 1juga karena Math.random()tidak terpotong. Namun, rentang akan menjadi [min, maks) karena Math.random"Mengembalikan nilai ganda dengan tanda positif, lebih besar dari atau sama dengan 0,0 dan kurang dari 1,0." Akan ada peluang yang sangat minim dari jumlah itu maxtetap saja, bahkan jika itu mungkin.
AusCBloke
44

Jika Anda ingin menghasilkan angka dari 0 hingga 100, maka kode Anda akan terlihat seperti ini:

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

Untuk menghasilkan angka dari 10 hingga 20:

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

Dalam kasus umum:

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

(di mana lowerboundinklusif dan upperboundeksklusif).

Penyertaan atau pengecualian upperboundtergantung pada pilihan Anda. Katakanlah range = (upperbound - lowerbound) + 1kemudian upperboundinklusif, tetapi jika range = (upperbound - lowerbound)kemudian upperboundeksklusif.

Contoh: Jika saya ingin bilangan bulat antara 3-5, maka jika rentang (5-3) +1 maka 5 inklusif, tetapi jika rentang hanya (5-3) maka 5 adalah eksklusif.

Teezy7
sumber
2
upperboundeksklusif? Saya pikir ini akan inklusif.
vidit
1
@vidit eksklusif
1
jangan berpikir Anda akan mendapatkan gambaran besar upperbound dapat berupa, seperti yang disediakan dalam contoh
Teezy7
19

The Randomkelas Java terletak di java.utilpaket akan melayani tujuan Anda yang lebih baik. Ini memiliki beberapa nextInt()metode yang mengembalikan bilangan bulat. Yang mengambil argumen int akan menghasilkan angka antara 0 dan int, yang terakhir tidak termasuk.

G_H
sumber
Saya memperbarui pertanyaan saya, saya ingin tahu bagaimana melakukannya Math.random(). Terima kasih.
switz
1

Untuk menghasilkan angka antara 10 hingga 20 inklusif, Anda dapat menggunakan java.util.Random

int myNumber = new Random().nextInt(11) + 10
Ilya Gazman
sumber
0

Berikut adalah metode yang menerima batas dan mengembalikan bilangan bulat acak. Ini sedikit lebih maju (sepenuhnya universal): batas bisa positif dan negatif , dan batas minimum / maksimum dapat datang dalam urutan apa pun.

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);
}

Secara umum, ia menemukan jarak absolut antara perbatasan, mendapatkan nilai acak yang relevan, dan kemudian menggeser jawaban berdasarkan batas bawah.

toleran terhadap kesalahan
sumber