2014-11-23 30 views
5
public class SumOfTwoDice 
{ 
    public static void main(String[] args) 
    { 
     int SIDES = 6; 
     int a = 1 + (int) (Math.random() * SIDES); 
     int b = 1 + (int) (Math.random() * SIDES); 
     int sum = a + b; 
     System.out.println(sum); 
    } 
} 

Tôi đã lấy mã này từ cuốn sách "Giới thiệu về lập trình với Java" của Sedgewick trên trang web trực tuyến của họ.Java Sum Of Two Dice - Liệu mã này sẽ đưa ra một số 6?

Tôi chỉ có câu hỏi là liệu a hoặc b có thể ở trên 6 nếu tình cờ Math.random()1.0? Hay tôi sai về điều này?

1.0 * 6 + 1 = 7?

+1

'Math.random()' sẽ không trả lại 1.0 –

Trả lời

3

Math.random() không thể trở về 1.0, vì vậy a hoặc b không thể 7.

/** 
* Returns a <code>double</code> value with a positive sign, greater 
* than or equal to <code>0.0</code> and less than <code>1.0</code>. <----------- 
* Returned values are chosen pseudorandomly with (approximately) 
* uniform distribution from that range. 
* 
* <p>When this method is first called, it creates a single new 
* pseudorandom-number generator, exactly as if by the expression 
* <blockquote><pre>new java.util.Random</pre></blockquote> This 
* new pseudorandom-number generator is used thereafter for all 
* calls to this method and is used nowhere else. 
* 
* <p>This method is properly synchronized to allow correct use by 
* more than one thread. However, if many threads need to generate 
* pseudorandom numbers at a great rate, it may reduce contention 
* for each thread to have its own pseudorandom-number generator. 
* 
* @return a pseudorandom <code>double</code> greater than or equal 
* to <code>0.0</code> and less than <code>1.0</code>. 
* @see  java.util.Random#nextDouble() 
*/ 
public static double random(); 
+1

Tôi đã đọc tài liệu cho Math.random() và tôi có thể đã thề rằng từ 0.0 đến 1.0 trước đó. Tôi chỉ đọc nó một lần nữa. Hôm nay thật là một đêm dài. – Naz

2

Không, Math.random() sẽ không bao giờ quay trở lại 1. Nó có một bao gồm thấp hơn ràng buộc từ 0, nhưng một độc quyền giới hạn trên của 1.0. Từ tài liệu - nhấn mạnh mỏ:

Trả về giá trị kép có dấu dương, lớn hơn hoặc bằng 0.0 và nhỏ hơn 1.0.

Bây giờ cho rằng đây là toán học dấu chấm động, bạn vẫn cần xem xét liệu có một số giá trị nhỏ hơn 1 chẳng hạn khi nhân với 6, số gần nhất là 6 chứ không phải giá trị dưới 6 ... nhưng tôi không tin rằng đó là một vấn đề ở đây.

Nó vẫn sẽ rõ ràng hơn để sử dụng java.util.Random dù ....

private static final int SIDES = 6; 

public static void main(String[] args) { 
    Random random = new Random(); 
    int a = random.nextInt(SIDES) + 1; 
    int b = random.nextInt(SIDES) + 1; 
    int sum = a + b; 
    System.out.println(sum); 
} 
+0

'(1 - 2 ** - 53) * 6' làm tròn gấp đôi so với' 6', vì vậy nó ổn. –

+0

@DavidEisenstat: Đúng - đó là loại điều tôi * nghi ngờ * sẽ ổn, nhưng không bao giờ hoàn toàn tin tưởng nếu không thực hiện các phép toán :) –

1

Phương pháp Math.random() không trả lại 1.0 vì nó có giới hạn của nó ở mức 0.0 tối đa nhưng không bao gồm 1.0 và nhân với 6 và thêm 1 nghĩa là (Math.random()*6)+1 sẽ trả về giá trị từ 1 đến 6 sau khi nhập thành (int).

Ngoài ra hai bên biến thể đã được khai báo là final

private static int SIDES = 6; 
+0

Bạn lấy 0,9 từ đâu? – Henry

+0

giới hạn 0,0 tối đa nhưng không bao gồm 1.0 –

+0

và khoảng 0,95 hoặc 0,991, ...? – Henry

0

ngẫu nhiên() có thể tạo ra giá trị gần đủ để 1, tuy nhiên họ sẽ luôn luôn nhỏ hơn 1. Vấn đề ở đây là các diễn viên để (int) từ một số dương. Kết quả sẽ luôn nhỏ hơn 6, thay đổi trong tập hợp {0,1,2,3,4,5}. Vì vậy, câu trả lời là KHÔNG, không phải là cũng không thể được bao giờ bởi 7. Hy vọng điều này sẽ giúp.

Để chứng minh, hãy chạy đoạn mã sau:

 
    double x=0.99; 
    System.out.println((int)(6*x)); 
Chơi với giá trị x, cho dù nó gần bằng 1, bạn vẫn sẽ nhận được 5 bản in trở xuống.

Các vấn đề liên quan