2011-11-01 42 views
97

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

Math.random() trả về một số từ số không đến một.

Nếu tôi muốn trở lại một số nguyên từ số không đến trăm, tôi sẽ làm:

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

Từ 1-100, tôi sẽ làm:

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

Nhưng nếu tôi muốn để làm điều đó từ ba đến năm? nó sẽ như thế nào tuyên bố sau:

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

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

+8

BTW: phạm vi từ 0.0 đến 1.0 độc quyền (bạn sẽ không actaully nhận 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 mà còn nhanh hơn nhiều. –

+1

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

+0

Đối với [3,5]: '(int) Math.floor (Math.random() * 3) + 3' –

Trả lời

130
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 bao gồm, ví dụ: [2,5], và min phải nhỏ hơn max trong ví dụ trên.

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

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 về double của bạn, nó 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 ngốc chống nó nó chỉ:

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

Nếu bạn không sử dụng '(int)' và muốn nó trả về 'double' thì sao? – switz

+0

Nếu bạn muốn tăng gấp đôi thì chỉ cần thay thế 'int' bằng 'double's (và kiểu chữ không cần thiết). Tôi cho rằng bạn muốn 'int' nhưng tôi sẽ thêm vào bài viết của tôi. – AusCBloke

+1

Thực ra với 'double' xóa '+ 1' cũng vì' Math.random() 'không bị cắt ngắn. Tuy nhiên, phạm vi sẽ là [min, max) từ 'Math.random'" Trả về một 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. " Sẽ có một cơ hội rất nhỏ của con số chính xác là 'max' dù cho nó có thể. – AusCBloke

17

Lớp học Random Java nằm trong gói java.util sẽ phục vụ mục đích của bạn tốt hơn. Nó có một số phương thức nextInt() trả về một số nguyên. Một tham số int sẽ tạo ra một số giữa 0 và int đó, cái sau không bao gồm.

+0

Tôi đã cập nhật câu hỏi của mình, tôi muốn biết cách thực hiện nó với 'Math.random()'. Cảm ơn. – switz

+0

+1 để có cách đáng tin cậy hơn để thực hiện điều đó. – trashgod

36

Nếu bạn muốn tạo ra một số từ 0 đến 100 sau đó mã của bạn sẽ trông như thế này:

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

Để tạo ra một số lượng 10-20:

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

Trong chung trường hợp:

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

(trong đó lowerbound bao gồm và upperbound exclu sive).

Việc bao gồm hoặc loại trừ Uppderbound tùy thuộc vào lựa chọn của bạn. Giả sử Range = (Uppderbound-lowerbound) +1 thì Uppderbound là Inclusive.nhưng nếu Range = (Uppderbound-lowerbound) thì Uppderbound là Exclusive. Ví dụ: Nếu tôi muốn số nguyên b/w 3-5, thì nếu phạm vi là (5-3) +1 thì 5 được bao gồm, 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

+0

@vidit độc quyền –