Java: Kann (new Random()).nextInt(5) immer wieder die gleiche Nummer?
Manchmal dieses Stück code gibt immer die gleiche Anzahl (und manchmal klappt es gut):
(new Random()).nextInt(5)
Ich habe einen Verdacht, wo das problem liegt - es wohl immer schafft eine neue, Zufällig mit dem gleichen seed. Was wäre also die beste Lösung:
- erstellen Sie eine statische var Random() und
verwenden Sie stattdessen. - verwenden Math.random() * 5
(sieht aus wie es verwendet eine static var
intern)
oder etwas anderes? Ich brauche nichts ausgefallenes, nur etwas, das aussieht random.
Es wäre auch hilfreich, wenn jemand erklären kann, warum der ursprüngliche code manchmal funktioniert und manchmal nicht.
Dank.
Ich denke, dies ist Ihre Antwort stackoverflow.com/questions/767999/...
Das ist die C# Zufällige, nicht Java. Oberflächlich ähnlich, aber nicht endgültig.
Ich denke, dies kann helfen, auch stackoverflow.com/questions/203382/...
Per definition ist eine zufällige Folge von zahlen, die Duplikate enthält. Ein Zufallszahlengenerator, der nie wieder die gleiche Zahl zweimal in einer Zeile ist nicht random. 3,3,3,3,3 ist eine Zufalls-Sequenz.
"Manchmal ist dieses Stück code gibt immer die gleiche Anzahl" - Was????????
Das ist die C# Zufällige, nicht Java. Oberflächlich ähnlich, aber nicht endgültig.
Ich denke, dies kann helfen, auch stackoverflow.com/questions/203382/...
Per definition ist eine zufällige Folge von zahlen, die Duplikate enthält. Ein Zufallszahlengenerator, der nie wieder die gleiche Zahl zweimal in einer Zeile ist nicht random. 3,3,3,3,3 ist eine Zufalls-Sequenz.
"Manchmal ist dieses Stück code gibt immer die gleiche Anzahl" - Was????????
InformationsquelleAutor serg | 2009-06-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der javadoc für java.util.Random ist klar:
Den default-Konstruktor ist auch klar:
In anderen Worten, keine Garantien.
Wenn Sie brauchen eine random-Algorithmus, verwenden Sie java.Sicherheit.SecureRandom.
Perfekt klar. Es nicht erklären, aber wie kommt es, es gibt den gleichen Wert, zu unterschiedlichen Zeiten (ich fordere nicht parallel) und es nicht sagen, welches Saatgut wird standardmäßig verwendet.
In der Tat, das ist der Grund, warum es sollte nicht verwendet werden, wenn Sie verlassen müssen, auf eine zufällige Anzahl stream und auch, warum es nicht von der java-crypto-Pakete.
Wenn Sie mehrere Instanzen von SecureRandom Sie gefährden die Fähigkeit zu liefern Zufallszahlen, nur so viel, wie Zufällig.
InformationsquelleAutor skaffman
So funktioniert es nach dem Zufallsprinzip??? 🙂 🙂 🙂
Ok, ok, downvote mich jetzt!!
Ich bin erstaunt, dass die letzten 4 Jahre, ich bin scheinbar der erste, der tatsächlich downvote.
Was bedeutet die stackoverflow-Modell funktioniert! Die meisten Menschen nicht bekommen, um diese nach unten.
In der Mitte eine ernste Forschung, lief ich in diese. Und es wirklich made my day 🙂 fühle mich nicht wie dieses downvoting, stattdessen gehe ich für ein bis...
InformationsquelleAutor
Wenn Sie aufrufen, die Zeile code auf die folgenden Zeilen, dann ja, werden die zwei Random-Instanzen, die Sie erstellen werden könnte, erstellt mit dem gleichen seed von der Uhr (die Uhr Millisekunden-tick-Zählung ist die Standard-seed für die Random-Objekte). Fast universell, wenn eine Anwendung muss mehrere Zufallszahlen, Sie würde erstellen Sie eine Instanz der Random-und re-verwenden Sie es so oft wie Sie benötigen.
Edit: Interessanter Hinweis, Der javadoc für Random hat sich geändert, seit 1.4.2, die erklärt, an dem die Uhr benutzt als Standard-Saatgut. Es scheint, dass ' s keine Garantie mehr.
Edit #2: Durch die Art und Weise, sogar mit einem richtig gesetzten Random-Instanz, die Sie wieder verwenden, erhalten Sie immer noch die gleiche zufällige Zahl als der Vorherige Anruf etwa 1/5 der Zeit, wenn Sie anrufen
nextInt(5)
.eine Anwendung braucht." Ich würde Sie nur seine derzeitige Umsetzung, (new Random()).nextInt(5), wenn meine Anwendung benötigt genau eine Zufallszahl. Wenn ich mehr als eine von Ihnen (die ist fast überall der Fall, wie Sie schon erwähnt haben) würde ich halten, dass Random-Objekt um.
InformationsquelleAutor Bill the Lizard
In Java 1.4, das Standard-Saatgut von einer neuen
Random
Instanz angegeben wurde, in der API-Dokumentation werden die ErgebnisSystem.currentTimeMillis()
. Offensichtlich eine enge Schleife erstellen könnte vieleRandom()
Instanzen pro tick, alle mit dem gleichen seed und alle produzieren die gleichen Pseudo-random-Sequenz. Das war besonders schlimm auf einigen Plattformen, wie Windows, wo die Uhr Auflösung war schlecht (10 ms oder höher).Seit Java 5 aber die Saat ist gesetzt ", ein Wert, der sehr wahrscheinlich Verschieden zu sein" für jeden Aufruf des Standardkonstruktor. Mit einem anderen Startwert für jede
Random
Instanz sollten die Ergebnisse erscheinen zufällig, wie gewünscht.InformationsquelleAutor erickson
In der Javadoc für Random nicht explizit über dieses, aber der Samen verwendet wird, ist wahrscheinlich abhängig von der aktuellen Systemzeit. Es hat die Zufallszahlen werden für die gleichen Samen. Wenn Sie den Anruf innerhalb derselben Millisekunde, wird es mit dem gleichen seed. Die beste Lösung ist wahrscheinlich, um eine statische Random-Objekt und verwenden Sie es für die nachfolgenden Aufrufe der Methode.
Ich würde sagen, er ist wahrscheinlich mit java 1.4 oder früher dann.
InformationsquelleAutor Jorn
Der beste Weg, um Ungefähre gleichmäßige Verteilung ist es, die statische Methode Random.nextInt(n) zu erzeugen, um ganze zahlen im Bereich [0, n-1] (ja, n ist ausgeschlossen). In Ihrem speziellen Beispiel, wenn Sie wollen, ganze zahlen im Bereich von 0 bis 5 einschließlich ist, Sie nennen würde, Zufällig.nextInt(6).
InformationsquelleAutor Chuck Daniels