2012-04-17 11 views

Odpowiedz

19

Nie ma Random.nextShort() metoda, więc można używać

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

+1 dlatego metoda zwraca liczbę w górę do liczby określonej (Exclusive). Zobacz here

To wygeneruje cyfr od 0 do włącznie Short.MAX_VALUE (liczb ujemnych nie były postulowane przez OP)

+0

I potrzebna jest gips. –

+0

dzięki @juergend, mam aktualizację odpowiedź – luketorjussen

+0

Ale jeśli dodasz 1, nie będziesz w stanie wygenerować 0? – Tudor

6

Co powiecie na short s = (short) Random.nextInt();? Zauważ, że wynikowa dystrybucja może mieć odchylenie. Specyfikacja języka Java gwarantuje, że nie spowoduje to wyjątku, int zostanie skrócone, aby zmieścić się w skrócie.

EDIT

rzeczywiście robi szybki test, uzyskany podział wydaje się być zbyt równomiernie rozłożone.

+0

co jeśli wygenerowana liczba jest większa niż krótka? – luketorjussen

+0

tylko ostatnie cztery bity zostaną zachowane, ale nie spowoduje to przepełnienia. – assylias

+0

, ale czy zmieni to precyzyjnie dostrojoną jednolitość generowanych liczb losowych? –

9

spodenki Java są zawarte w -32 → +32 767 768 przedziale.

dlaczego nie chcesz wykonać

Random.nextInt(65536) - 32768 

i oddanych wynik w krótkiej zmiennej ?

+1

+1 - Właśnie chciałem napisać dokładnie to. – Deco

+4

Zgaduję i napisałem to dla ciebie, aby przedłużyć żywotność klawiatury. –

3

Wystarczy wygenerować int odczuwalna:

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

Wygenerowany int będzie w przestrzeni wartości short, dzięki czemu może być oddane bez utraty danych.

+0

Spowoduje to wygenerowanie nieujemnych krótkich wartości, z wyjątkiem Short.MAX_VALUE –

8

Najbardziej wydajnym rozwiązaniem, które może wytworzyć wszystkie możliwe krótkie wartości, jest wykonanie.

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

lub nawet szybciej

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

Dobrze zrobione. – assylias

Powiązane problemy