2016-06-20 13 views
3

Wie der Titel erklärt, möchte ich eine Reihe zufälliger kurzer Werte generieren. Da es keine Random.nextShort() Funktion ist, ist die einfachste Art und Weise zu tun, was ich will scheint ganze Zahlen zu kurz zu sein zu werfen, mit:Werden zufällige ganze Zahlen zu kurz, um eine gleichmäßige Verteilung zu erhalten?

Random rand = new Random(int seed); 
(short) rand.nextInt() 

Allerdings verstehe ich nicht ganz, wie das Gießen stattfindet und deshalb kann ich nicht sicher sein, dass die resultierenden kurzen Werte immer noch zufällig sind. Ist das der Fall? Danke im Voraus.

Antwort

3

Die kanonische Weise zu tun short result = (short)(rand.nextInt(Short.MAX_VALUE-Short.MIN_VALUE+1) + Short.MIN_VALUE). Der Grund dafür ist, dass Sie eine Zahl aus einem Bereich wünschen, der Short.MAX_VALUE-Short.MIN_VALUE+1 Werte umfasst und bei Short.MIN_VALUE beginnt.

Einfache Kürzung kann genug Fort shortsein (und wenn Geschwindigkeit für Sie wichtig ist, ist es wahrscheinlich auch schneller), aber dieser Ansatz funktioniert für jeden Bereich.

Angenommen, Sie haben eine Zufallszahl zwischen -5 wollen und 12 (beide eingeschlossen), werden Sie dann rand.nextInt(12-(-5)+1)+(-5) rufen, oder wenn Sie alle Berechnungen vereinfachen: rand.nextInt(18)-5.

-1

Die Zahl wird noch zufällig sein, aber Sie können verschiedene max/min Werte dieser Zahl, für weitere Informationen, schauen Sie haben Problem mit dem hier auf den ersten Antwort here

-1

Ich denke, das wird nicht funktionieren, weil ein int ist viel größer als ein short.

Nehmen Sie einfach eine zufällige float oder double (die Werte liegen zwischen [-1; 1]) und multiplizieren Sie sie mit dem Maximalwert eines Kurz:

short i= (short) rand.nextFloat() * Short.MAX_VALUE; 
4

Eine kurze Besetzung eines int funktioniert durch bitweise Abschneiden. Solange die ganzen Zahlen zufällig verteilt sind, sollten die kurzen Werte auch - ja sein.

Aus der Java Language Specification 5.1.3:

Eine Verengung Umwandlung einer Ganzzahl mit Vorzeichen zu einem integralen Typ T einfach alles verwirft, aber die n Bits niedrigster Ordnung, wobei n die Anzahl von Bits verwendet repräsentieren Typ T.

int hat 32 Bits, hat short 16. die Umwandlung ist die gleiche wie Addieren (oder Subtrahieren) 65536 Wesentlichen (das 2 auf die Leistung von 16 ist), bis der Wert in dem Bereich r ist vorstellbar durch short. Somit gibt es genau 65536 int Werte, die auf jeden möglichen short Wert abgebildet werden.

1

Eine gute Lösung Fehler zu vermeiden ist:

Random rand = new Random(int seed); 
short s = (short) rand.nextInt(Short.MAX_VALUE + 1); 

Wenn Sie auch negative Kurz benötigen:

short s = (short) rand.nextInt(Short.MAX_VALUE - Short.MIN_VALUE + 1) + Short.MIN_VALUE; 

A schnellste Lösung:

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

Das ist gut, aber es gibt Ihnen nur nicht negative Ergebnisse. – biziclop