Einzigartige random-Nummer für einen bestimmten timestamp
Bin ich irgendwie learning-Konzepte von Random number generation & Multi-Threading in java.
Die Idee ist, nicht die Erzeugung eine wiederholte zufällige Anzahl Reihe 1000 in einer bestimmten Millisekunde (wenn man Bedenkt, dass nicht mehr als 50 Daten, die in einem Multithreading-fähigen Weise verarbeitet werden, in einer Millisekunde). So, die Liste von zufällig generierten Nummer, die auf bestimmte Zeit ist einzigartig. Können Sie mir eine Idee, wie ich am Ende der Generierung paar wiederholt Zufallszahlen (auch, gibt es eine beträchtliche Wahrscheinlichkeit) in eine bestimmte milli Sekunde.
Ich habe versucht, die folgenden Dinge, wo ich versagt habe.
Random random = new Random(System.nanoTime());
double randomNum = random.nextInt(999);
//
int min=1; int max=999;
double randomId = (int)Math.abs(math.Random()* (max - min + 1) + min);
//
Random random = new Random(System.nanoTime()); //also tried new Random();
double randomId = (int)Math.abs(random.nextDouble()* (max - min + 1) + min);
Als ich bin, indem der Zeitstempel, der generiert wird, in einer Multithread-Umgebung, die ich sehen, die gleichen ids (um die 8-10), die erzeugt wird (2-4 mal) für 5000+ einzigartige Daten.
- Was haben Sie bisher ausprobiert? Bitte fügen Sie einige Ihrer code. Wo genau ist das problem?
- Es wäre besser, Sie würde versuchen zu klären, eine Sache nach der anderen. Zum Beispiel, multithreading hat nichts zu tun mit der Erzeugung von Zufallszahlen, also sollten wir nicht verwechseln.
- Was sind die max und min?
- gud fangen ingo, habe ich begonnen zu geben etwas andere Frage!!! endete diese Frage zu stellen!!
- min und max sind im Bereich 1-999!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Klasse ermöglicht es Ihnen, sich einmalig auftretenden Werten aus einen bestimmten Bereich, bis die ganze Reihe verwendet wurde. Sobald die Palette verwendet wird, wird es neu initialisiert werden.
Klasse kommt zusammen mit einem einfachen test.
Wenn Sie möchten, dass die Klasse thread-sicher, fügen Sie einfach
synchronized
zunextInt()
Erklärung.Dann können Sie das singleton-Muster oder einfach nur eine statische variable zum Zugriff auf den generator aus mehreren threads. Auf diese Weise werden alle Ihre threads wird das gleiche Objekt und die gleiche einzigartige id-pool.
curVals
imrebuildCurVals()
, und dann ständig entfernen der letzten - element in der Liste. Oder vielleicht suchen Sie in einem anderen (vielleicht BrauchQueue
Umsetzung?) Daten-Struktur.nextInt()
genannt wird und als index > baseVals.size(): shuffle baseVals, dann wird der index zurückgesetzt auf null.Ersten, die Sie verwenden sollten
new Random()
, da sieht es wie diese (Einzelheiten hängen von der Java-version):I. e. es macht bereits Gebrauch von
nanoTime()
und stellt sicher, dass verschiedene threads mit dem gleichennanoTime()
Ergebnis bekommen verschiedene Samen, dienew Random(System.nanoTime())
nicht.(EDIT: Pyranja wies darauf hin, dies ist ein bug in Java 6, aber es ist behoben in Java 7:
)
Zweitens, wenn Sie generieren 50 zufällige zahlen von 1 bis 1000, ist die Wahrscheinlichkeit, einige zahlen werden die gleichen sein, ist Recht hoch, Dank das Geburtstags-Paradoxon.
Dritten, wenn Sie wollen einfach nur eine eindeutige id, Sie konnte einfach
AtomicInteger
Zähler anstelle von Zufallszahlen. Oder, wenn Sie möchten, eine zufällige Teil, mit zu beginnen, fügen Sie einen Zähler, als auch zur Eindeutigkeit zu gewährleisten.seedUniquifier
. ObwohlseedUniquifier
ist flüchtig, die++
operator ist nicht atomic. Um auf der sicheren Seite sein, sollte man Sie nutzen ein AtomicInteger oder AtomicLong zu halten, den Ausgangswert oder mit anderen Mitteln der ordnungsgemäße Synchronisierung.Wenn ich verstehe deine Frage richtig, mehrere threads erstellen Ihre eigenen Instanzen der Random-Klasse zur gleichen Zeit und alle threads erzeugen die gleiche zufällige Zahl?
Gleiche Zahl erzeugt wird, weil alle random-Instanzen, wo zur gleichen Zeit erstellt, d.h. mit dem gleichen seed.
Dieses Problem zu beheben, erstellen Sie nur eine Instanz der Random-Klasse, die gemeinsam von allen threads so, dass alle deine threads aufrufen nextDouble() auf die gleiche Instanz. Random.nextDouble () - Klasse ist thread-sicher und wird implizit für die Aktualisierung seiner Samen mit jedem Aufruf.
Nun alle threads die gleiche Instanz: