Immer dieselbe Zufallszahl

krgewb

Top Contributor
Ich habe viele Elemente, die ich aus einer Datenbank hole. Jedes Element hat eine eindeutige ID. Nun generiere ich für jedes Element eine zufällige Farbe. Ich zeige dann die Daten in einer Tabelle an. Dort gibt es ein Icon, das jene Farbe annimmt. Das Problem ist, dass sich die Farben nach einem Logout und erneutem Login ändern. Kann ich dem Zufallszahlengenerator irgendwie sagen, dass er die ID als Seed nehmen soll, damit dann dieselbe Pseudo-Zufallszahl herauskommt?
 
Du kannst eine Instanz der Klasse Random erzeugen und dann die id als seed übergeben
Random (Java SE 17 & JDK 17) (oracle.com)

Edit: setSeed kann natürlich auch genutzt werden, wenn man nicht ständig eine neue Instanz erzeugen will. Da dann nur aufpassen, dass Du nicht mit mehreren Threads gleichzeitig sowas machst. Und ggf. brauchst Du das auch nicht, denn bei setSeed ist angegeben, dass dort die Berechnung (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1) durchgeführt wird. Und next() macht (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1). Evtl. reicht es schon aus, diese Operationen selbst durchzuführen um dann eine Pseudo Zufallszahl zu generieren.
 
Zuletzt bearbeitet:
Man kann sich auch eine eigene Implementierung von einem "einfachen" Zufallszahlengenerator schreiben, entweder wie Konrad schon sagte abgeschaut von Random, oder zum Beispiel SplitMix64 oder XorshiftStar. Das hat den Vorteil dass es immer die gleichen Werte geben wird, weil ich glaube das Random ueber Java Versionen hinweg nicht die gleiche Reihenfolge an Zahlen fuer den selben Seed garantiert...glaube ich.
 
Statt Zufallszahlen: warum nicht einfach die ID selbst nehmen, u.U. vorher mal X und/oder modulo Y?
Das ist effektiv was Konrad und ich vorgeschlagen haben, nur sind wir beide davon ausgegangen dass nur eine Zahl generiert werden wird. Also quasi:

Java:
int base = new Random(id).nextInt();

Etwas optimieren sollte man vermutlich, und vielleicht waere auch ein Zwischenspeicher fuer die Farben eine gute Idee, aber im Groszen und Ganzen genau dies.
 

Zurück
Oben