Zufälliger Long

Naaram

Mitglied
Naja das Problem ist folgendes, nehmen wir an, ich muss eine Zufallszahl zwischen -5.000.000.000 und 5.000.000.000 erzeugen. Wenn ich nun ein Random-Boolean erzeuge (für Vorzeichen), und danach eine Random-Zahl zwischen 0 und 5.000.000.000, dann ist die Chance für die 0 doppelt so groß. Wenn ich die 0 aber bei den negativen Zahlen rausnehme, dann ist die Chance auf eine bestimmte negative Zahl um 1/5.000.000.000 höher als auf eine entsprechende positive Zahl.
 
S

SlaterB

Gast
Standardvorgehen:
du erstellst eine Zufallszahl zwischen 0 und 10 Mio. und ziehst dann 5 Mio. ab
 
S

Spacerat

Gast
Lass dir Zahlen zwischen 0 und 10.000.000.000 erzeugen und zieh' 5.000.000.000 ab oder geht das nicht?
[EDIT]much too slow ;) ... SlaterB meint sicher auch 10 Mrd.[/EDIT]
 
S

SlaterB

Gast
na dann prüfe erst ob positiv oder negativ, und erstelle dann im positiven Fall 0-Max,
im negativen Fall nur von 0-Max-1 und bilde das auf -1 bis -Max ab,

wie auch immer das zu verschieben ist, das negative Maximum ist ja eh größer,
also wahrscheinlich doch 0-Max, auf -1 bis -Max-1 verschieben

(-9223372036854775808 ... 9223372036854775807)

edit: ich las irgendwie, dass es um den kompletten Long-Bereich geht, aber das steht ja doch nirgendwo,
was ist denn das Problem, welches 'hinreichend große n' ist gemeint? muss es bis zu 18 Stellen gehen?
mit einem unsigned wärst du doch nicht besser dran wenn du dann gar keine negativen Zahlen darstellen kannst?
 
Zuletzt bearbeitet von einem Moderator:
S

Spacerat

Gast
Nein das mache ich jetzt genau so, aber das funktioniert nicht für hinreichend große n. Java hat ja keine unsigned typen.
Also 10 Mrd. passen noch in ein int. Ich weiss jetzt nicht was hinreichend grosse Zahlen sind. Im Zweifelsfall kann man auch mit "<Random>.nextBytes(byte[] target)" ein Bytearray erstellen und damit einen BigInteger instanzieren. Speziell für Primzahlen gibt es noch "BigInteger.probablePrime(int bitLength, Random rnd)".
 
N

nillehammer

Gast
Erzeug Dir mit Random zwei ints und shifte/odere sie in ein long. So geht's:
Java:
	public static long nextRandomSignedLong(final Random rnd) {

		long result = rnd.nextInt();
		
		result = result << Integer.SIZE;
		
		result |= rnd.nextInt();

		return result;
	}
[EDIT]
Ah, warte mal. Die Intervall-Anforderung hab ich garnicht beachtet! Hmm, noch mal bischen nachdenken...
[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
mit 'die Schleife' meinst du den Link im ersten Posting?
zum Glück bin ich so schlau das nun alles zu verstehen (und mich auch selbst zu loben ;) )

Random.nextLong(long n)
gibt es in der Tat nicht,
also nutze
nextLong(Random rng, long n)
aus dem Link

wie ich geschrieben habe zusammen mit

na dann prüfe erst ob positiv oder negativ, und erstelle dann im positiven Fall 0-Max,
im negativen Fall nur von 0-Max-1 und bilde das auf -1 bis -Max ab,

edit: ach nö, würde die wenigeren negativen Zahlen bevorzugen, falls diese weniger sind als 0 bis Max

------

oder auch die 'Standard-Variante', die dann auch die Methode aus dem Link braucht,
und erkläre was du mit 'funktioniert nicht für hinreichend große n' meinst
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
Naaram hat gesagt.:
Leider kommen bei rng.nextInt() % n keine gleichverteilten Zufallszahlen raus. Deswegen braucht man ja die Schleife.
Dazu zunächst die API-Doc von Random.nextInt():
http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt() hat gesagt.:
Returns the next pseudorandom, uniformly distributed int value from this random number generator's sequence.
Die Zahlen sind in dieser Implementierung also zwar nur pseudo-zufällig aber zumindest gleichverteilt.

Durch das Modulo ergeben sich aber tatsächlich Verschiebungen. Long geht im Negativen bis -xxxx7 und im Positiven bis xxxx8. Dadurch ergibt sich eine gerinfügig höhere Wahrscheinlichkeit für bestimmte Werte, je nachdem wie die Grenze gewählt wurde. Das wäre im Code noch zu berücksichtigen. Ich glaube, das hat Spacerat schon getan, wenn man sich seinen Beitrag im Antwort- oder Zitatmodus anschaut, hat er nämlich nicht einfach Modulo (%) geschrieben, sondern das hier:
Code:
(result & 0x7FFFFFFF) % intervall * 2 - intervall
 
Zuletzt bearbeitet von einem Moderator:
B

bone2

Gast
Gibts doch alles fertig :S
Java:
        BigInteger c = new BigInteger(16, new Random());
        System.out.println(c);
ergibt ne gwünschte länge, muss man nur noch nach rechts oder linke schieben je nach anfang

[EDIT]einen makel entdeckt, den mein kopf gerade nich lösen mag.
man kann damit nur rnd zahlen in ganzen bit schritten erzeugen

bei 10 bis 20 wären es min 4 bit für die 10 range aber 4 bit ist ja 0-15[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
schon wieder so ein Thread mit so vielen halben Lösungen..,

eine Korrektur habe ich noch anzumerken @nillehammer/ Spacerat:
> long result = rnd.nextInt();
> result = result << Integer.SIZE;
> result |= rnd.nextInt();

hier muss die dritte Zeile
> result |= (rnd.nextInt() & 0xFFFF);
lauten, sonst werden die 32 führenden 1en bei einem negativen zweiten Wert per | übernommen

vor dem Modulo lag die Wahrscheinlichkeit auf einen negativen Wert bei 75%,
durch das Modulo mag es gar nicht mehr unbedingt ein Problem sein

aber wo nun welche Wahrscheinlichkeiten abweichen, da klinke ich mich doch besser aus..
 
N

nillehammer

Gast
@SlaterB: Danke für den Hinweis! Ich war bis jetzt immer davon ausgegangen, dass bei logischen Operationen die Bitmasken "as is" unter einander gelegt werden. Dass sie ggf. upgecastet werden, was bei negativen Zahlen natürlich das Auffüllen mit einsen bedeutet, ist mir nie aufgefallen! (So einen Anwendungsfall hatte ich aber ehrlich gesagt auch noch nicht).
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
RowdyN Methoden Befehle in zufälliger Reihenfolge ausführen lassen Java Basics - Anfänger-Themen 5
S Zufälliger Zahlengenerator Java Basics - Anfänger-Themen 7
G Zahlen in zufälliger Reihenfolge ausgeben/speichern. Java Basics - Anfänger-Themen 2
Rudolf Datentypen Vectorliste mit Werten in zufälliger Anordnung Java Basics - Anfänger-Themen 5
D zufälliger Spielplan Java Basics - Anfänger-Themen 3
G Array mit zufälliger Länge Java Basics - Anfänger-Themen 4
B Stack mit Strings in zufälliger Reihenfolge füllen Java Basics - Anfänger-Themen 4
krgewb String mit Datumsangabe in Long umwandeln Java Basics - Anfänger-Themen 2
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
M Long-Typ in String-Änderung führt zu keinem Ergebnis bei großer Zahl Java Basics - Anfänger-Themen 11
MiMa Probleme mit Datentyp long ?? Java Basics - Anfänger-Themen 2
C Long value an Stringbuilder übergeben, equals Methode funktioniert nicht Java Basics - Anfänger-Themen 2
krgewb Long wird gerundet Java Basics - Anfänger-Themen 2
Eule25 Arbeit mit long und int, Error: integer number too large Java Basics - Anfänger-Themen 2
javapingu Hex String zu long Java Basics - Anfänger-Themen 2
J Long Typ Java Basics - Anfänger-Themen 4
FelixN Array mit verschiedene Datentypen als Rückgabewert? (Long und Double) Java Basics - Anfänger-Themen 3
I Klassen Eine ArrayList<Long>, die sich automatisch sortiert Java Basics - Anfänger-Themen 20
O Long[] in long Java Basics - Anfänger-Themen 3
D Compiler-Fehler Java long und int Java Basics - Anfänger-Themen 1
Harlequin Compiler-Fehler Text Adventure - "Long Output" Fehler Java Basics - Anfänger-Themen 3
W The type Long is not visible HashMap Java Basics - Anfänger-Themen 4
Hanschyo String kann nicht Werte von Long annehmen Java Basics - Anfänger-Themen 2
Orkanson Long Binär darstellen Java Basics - Anfänger-Themen 1
F HashMap sortieren <String, Long> Java Basics - Anfänger-Themen 3
E Von Double zu Long umwandeln Java Basics - Anfänger-Themen 9
J Datentypen Literal überschreitet long-Range, dennoch als long an Variable übergeben Java Basics - Anfänger-Themen 9
T Bitte um Hilfe bei Aufgabe: Long zahl = Long.parseLong(args [0]); Java Basics - Anfänger-Themen 3
K Erste Schritte switch - Warum sind long/float/double/... nicht erlaubt? Java Basics - Anfänger-Themen 5
F Char in Long umwandeln? Java Basics - Anfänger-Themen 2
M Frage Long Wert in Java Java Basics - Anfänger-Themen 1
A Long in BigInteger Java Basics - Anfänger-Themen 3
T long wird ohne Nachkommastellen ausgegeben Java Basics - Anfänger-Themen 5
G Long und Frage zum Speicherplatz eines Arrays Java Basics - Anfänger-Themen 7
S OOP long prüfen Java Basics - Anfänger-Themen 5
B map.remove(long) Java Basics - Anfänger-Themen 5
G Rechnen mit Long Variablen Java Basics - Anfänger-Themen 4
SheldoN Zahlen die über long-Wert hinausragen Java Basics - Anfänger-Themen 4
H TreeMap<> statt TreeMap<Long, String> Java Basics - Anfänger-Themen 2
SheldoN Gibt es größere Datentypen als long? Java Basics - Anfänger-Themen 2
G Long oder int Vorzeichen entfernen Java Basics - Anfänger-Themen 3
M Datentypen Calender TimeInMillis - long number erzeugen? Java Basics - Anfänger-Themen 2
D Konvertierung UnsignedInt zu long Java Basics - Anfänger-Themen 5
A long Wert in hexadezimales Array umwandeln Java Basics - Anfänger-Themen 3
A string bitweise in long umwandeln Java Basics - Anfänger-Themen 7
A Konvertierung String-->hex-->long Java Basics - Anfänger-Themen 7
O 64bit- OS byte, short, int oder long bzw. float oder double? Java Basics - Anfänger-Themen 13
G Datentypen Ein long[]-Array. Java Basics - Anfänger-Themen 5
G Datentypen Eclipse akzeptiert 'long' nicht Java Basics - Anfänger-Themen 2
N Mit long rechnen Java Basics - Anfänger-Themen 2
W Long to String Java Basics - Anfänger-Themen 7
B Long als Eingabeaufforderung Java Basics - Anfänger-Themen 3
H Long (64Bit) in 2 int (32Bit) zerlegen Java Basics - Anfänger-Themen 2
S Long und Float Frage Java Basics - Anfänger-Themen 2
N Datentypen Wurzel aus long ziehen Java Basics - Anfänger-Themen 4
O Runden - x/100 liefert long zurück Java Basics - Anfänger-Themen 7
A mdoulo methode mit long Java Basics - Anfänger-Themen 9
Binary.Coder Skalarprodukt mittels long und binärzahlen Java Basics - Anfänger-Themen 5
A Long zu Double Java Basics - Anfänger-Themen 4
B (long)1e9 Java Basics - Anfänger-Themen 6
V wozu ist das 'L' beim long notwendig ? Java Basics - Anfänger-Themen 5
J Länge eines long wertes Java Basics - Anfänger-Themen 13
S Division von long! Java Basics - Anfänger-Themen 4
Spot84 long von getCreationDate in String umwandeln Java Basics - Anfänger-Themen 4
S Probleme beim Umwandeln von Long nach Int Java Basics - Anfänger-Themen 4
G long[] aus SQL-Abfrage Java Basics - Anfänger-Themen 3
G String in Long casten Java Basics - Anfänger-Themen 2
N long geteilt durch long gleich null ? Java Basics - Anfänger-Themen 8
G int gleich long ? Java Basics - Anfänger-Themen 2
J A Long. way Java Basics - Anfänger-Themen 10
T Probleme mit long Java Basics - Anfänger-Themen 2
G NumberFormatException bei double und long Java Basics - Anfänger-Themen 11
G long zu kurz Java Basics - Anfänger-Themen 5
G long datum splitten in day etc Java Basics - Anfänger-Themen 23
G Konvertierung String in long type Java Basics - Anfänger-Themen 15
G Zahlen >long verwenden Java Basics - Anfänger-Themen 7
G Problem beim rechenen mit long Java Basics - Anfänger-Themen 3
G long oder double Java Basics - Anfänger-Themen 15
C Long -> String -> ArrayList adden -> Exception Java Basics - Anfänger-Themen 4
M long in byte[] konvertieren und wieder zurück Java Basics - Anfänger-Themen 2
S long millisekunden nach Uhrzeit format Java Basics - Anfänger-Themen 5
M Quersumme einer long zahl Java Basics - Anfänger-Themen 4
M long Datentyp effizient mit Daten füllen Java Basics - Anfänger-Themen 2
F Long umwandeln und auf 2 Dezimalen runden? Java Basics - Anfänger-Themen 14
G long in string Java Basics - Anfänger-Themen 6
G long-Zeitwert Java Basics - Anfänger-Themen 11
P "Line too long" bei der Generierung des jars. Java Basics - Anfänger-Themen 5
B String <> long --- Das ist doch nicht inkonvertibel? Java Basics - Anfänger-Themen 4
F Long zu 2 int und zurück Java Basics - Anfänger-Themen 3
G Hexadezimalzahl von String in Long umwandeln Java Basics - Anfänger-Themen 3
P von long zu int umwandeln? Java Basics - Anfänger-Themen 3
A formatieren long(bytes) -> String Java Basics - Anfänger-Themen 2
T long in Vector speichern Java Basics - Anfänger-Themen 16
G "cannot convert from long to int" - problem Java Basics - Anfänger-Themen 9
G Vergleich zweier 'long'-Werte. Problem! Java Basics - Anfänger-Themen 6
M long nach String casten Java Basics - Anfänger-Themen 2
N x.toString(x); umwandlung von long in String Java Basics - Anfänger-Themen 3
P Wie mach ich aus Int ein Double oder Long ? Java Basics - Anfänger-Themen 6
N unsigned int to long Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben