Math.random () giải thích


133

Đây là một câu hỏi Java khá đơn giản (mặc dù có thể áp dụng cho tất cả các chương trình):

Math.random() trả về một số từ 0 đến 1

Nếu tôi muốn trả về một số nguyên từ 0 đến trăm, tôi sẽ làm:

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

Từ một đến trăm, tôi sẽ làm:

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

Nhưng nếu tôi muốn có được một số từ ba đến năm thì sao? Nó sẽ giống như tuyên bố sau đây:

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

Tôi biết về nextInt()java.lang.util.Random. Nhưng tôi muốn học cách làm điều này với Math.random().


Dành cho [3,5]:(int)Math.floor(Math.random()*3) + 3
good_evening

9
BTW: phạm vi từ 0,0 bao gồm đến 1,0 độc quyền (bạn sẽ không thực sự nhận được 1.0 bao giờ) Sử dụng nextInt () là một lựa chọn tốt hơn nhiều, không chỉ đơn giản hơn mà còn nhanh hơn nhiều.
Peter Lawrey

2
Sử dụng Math.ceillà sai, nó cho kết quả sai khi Math.random()trả về 0.
starblue

Nếu Math.floor trả về 0,029 thì sao? Làm thế nào để luôn luôn có được một số có hai chữ số với một câu lệnh?
Naisheel Verdhan

Câu trả lời:


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

Sản lượng randomWithRange(2, 5)10 lần:

5
2
3
3
2
4
4
4
5
4

Các giới hạn được bao gồm, tức là [2,5], và minphải nhỏ hơnmax trong ví dụ trên.

EDIT: Nếu ai đó sẽ cố gắng ngu ngốc và đảo ngược minmax, bạn có thể thay đổi mã thành:

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

EDIT2: Đối với câu hỏi của bạn về doubles, đó chỉ là:

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

Và một lần nữa nếu bạn muốn chứng minh điều đó thì đó chỉ là:

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

1
Điều gì nếu bạn không sử dụng (int)và muốn nó trả lại double?
switz

Nếu bạn muốn nhân đôi thì chỉ cần thay ints bằng doubles (và typecast là không cần thiết). Tôi giả sử bạn muốn ints nhưng tôi sẽ thêm vào bài viết của tôi.
AusCBloke

2
Trên thực tế với doubles cũng loại bỏ + 1Math.random()không bị cắt cụt. Tuy nhiên, phạm vi sẽ là [tối thiểu, tối đa) vì Math.random"Trả về giá trị kép với dấu dương, lớn hơn hoặc bằng 0,0 và nhỏ hơn 1.0". Có rất ít khả năng con số trở thành chính xác maxdù thế nào đi chăng nữa ngay cả khi điều đó là có thể.
AusCBloke

44

Nếu bạn muốn tạo một số từ 0 đến 100, thì mã của bạn sẽ như thế này:

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

Để tạo một số từ 10 đến 20:

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

Trong trường hợp chung:

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

(nơi lowerboundbao gồm và upperboundđộc quyền).

Việc bao gồm hoặc loại trừ upperboundphụ thuộc vào sự lựa chọn của bạn. Hãy nói rằng range = (upperbound - lowerbound) + 1sau đó upperboundlà bao gồm, nhưng nếu range = (upperbound - lowerbound)sau đó upperboundlà độc quyền.

Ví dụ: Nếu tôi muốn một số nguyên trong khoảng 3-5, thì nếu phạm vi là (5-3) +1 thì 5 đã bao gồm, nhưng nếu phạm vi chỉ là (5-3) thì 5 là độc quyền.


2
upperboundđộc quyền? Tôi nghĩ rằng nó sẽ được bao gồm.
vidit

1
@vidit là độc quyền

1
đừng nghĩ rằng bạn đang tham gia vào bức tranh lớn có thể là một trong hai ví dụ
Teezy7

19

Các Randomlớp của Java nằm trong java.utilgói phần mềm sẽ phục vụ mục đích của bạn tốt hơn. Nó có một số nextInt()phương thức trả về một số nguyên. Đối số lấy tham số int sẽ tạo ra một số từ 0 đến int đó, đối số sau không bao gồm.


Tôi đã cập nhật câu hỏi của mình, tôi muốn biết làm thế nào để làm điều đó với Math.random(). Cảm ơn.
switz

1

Để tạo số bao gồm từ 10 đến 20, bạn có thể sử dụng java.util.Random

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

0

Đây là một phương thức nhận ranh giới và trả về một số nguyên ngẫu nhiên. Nó tiên tiến hơn một chút (hoàn toàn phổ quát): các ranh giới có thể là tích cực và tiêu cực , và các ranh giới tối thiểu / tối đa có thể đến theo bất kỳ thứ tự nào.

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

Nói chung, nó tìm thấy khoảng cách tuyệt đối giữa các đường viền, nhận giá trị ngẫu nhiên có liên quan và sau đó thay đổi câu trả lời dựa trên đường viền dưới cùng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.