2012-04-17 51 views
11

Tôi muốn tạo một số ngẫu nhiên loại ngắn chính xác như có một hàm cho kiểu số nguyên gọi là Random.nextInt (134116). Làm thế nào tôi có thể đạt được nó?tạo số ngẫu nhiên ngắn trong java?

+0

bạn cần số âm? – luketorjussen

+0

no luke Tôi không cần phủ định chỉ từ 0 đến tối đa ngắn – waqas

Trả lời

19

Không có phương pháp Random.nextShort(), vì vậy bạn có thể sử dụng

short s = (short) Random.nextInt(Short.MAX_VALUE + 1); 

+1 là bởi vì phương pháp này trả về một số lên đến số lượng quy định (không bao gồm). Xem here

Điều này sẽ tạo ra các số từ 0 đến Short.MAX_VALUE bao gồm (số âm không được yêu cầu của OP)

+0

Và cần có dàn diễn viên. –

+0

cảm ơn @juergend, tôi đã cập nhật câu trả lời – luketorjussen

+0

Nhưng nếu bạn thêm 1, bạn sẽ không thể tạo 0? – Tudor

6

Làm thế nào về short s = (short) Random.nextInt();? Lưu ý rằng bản phân phối kết quả có thể có độ lệch. Đặc tả Ngôn ngữ Java đảm bảo rằng điều này sẽ không dẫn đến Ngoại lệ, int sẽ bị cắt ngắn để vừa với một đoạn ngắn.

EDIT

Trên thực tế làm một thử nghiệm nhanh, phân phối kết quả dường như được phân bố đều quá.

+0

nếu số được tạo ra lớn hơn số lượng được giữ trong một thời gian ngắn thì sao? – luketorjussen

+0

chỉ bốn bit cuối cùng sẽ được giữ lại, nhưng nó sẽ không tạo ra tràn. – assylias

+0

nhưng nó có làm thay đổi tính đồng nhất tinh chỉnh của các số ngẫu nhiên được tạo ra không? –

9

Java quần short có trong -32 768 → 32 767 khoảng.

lý do tại sao bạn sẽ không thực hiện một

Random.nextInt(65536) - 32768 

và đúc kết quả vào một biến ngắn?

+1

+1 - Tôi vừa mới viết chính xác điều đó. – Deco

+4

Tôi đoán nó và đã viết nó cho bạn vì vậy bạn sẽ kéo dài tuổi thọ của bàn phím của bạn. –

3

Đơn giản chỉ cần tạo ra một int như:

short s = (short)Random.nextInt(Short.MAX_VALUE); 

Các tạo int sẽ được trong không gian giá trị của short, vì vậy nó có thể được đúc mà không mất dữ liệu.

+0

Điều đó sẽ tạo ra các giá trị ngắn không âm, ngoại trừ Short.MAX_VALUE –

8

Giải pháp hiệu quả nhất có thể sản xuất tất cả các giá trị ngắn có thể là thực hiện.

short s = (short) random.nextInt(1 << 16); // any short 
short s = (short) random.nextInt(1 << 15); // any non-negative short 

hoặc thậm chí nhanh hơn

class MyRandom extends Random { 
    public short nextShort() { 
     return (short) next(16); // give me just 16 bits. 
    } 
    public short nextNonNegativeShort() { 
     return (short) next(15); // give me just 15 bits. 
    } 
} 

short s = myRandom.nextShort(); 
+2

Thực sự tốt. – assylias