Java. Zufallsgenerator, abhängig vom Int-Feld einer Klasse?
Folgende Geschichte. ich bin recht neu was Java angeht. Ich arbeite an einem Programm.
Zuerst erstellt das Programm ein Array, eine Arraylist oder Ähnliches von Objekten. Die Objekte selbst sind nicht so wichtig, sie beinhalten aber einen int Wert, welcher ihre Häufigkeit bestimmen soll.
Dann soll das Programm eins der Objekte zufällig aussuchen.
Ich habe es mir so vorgestellt, dass wenn ich zum Beispiel zwei Objekte habe, eins mit dem Wert 4 und eins mit dem Wert 3, dass ersteres eine Wahrscheinlichkeit von 4/7 hat, das andere eine Wahrscheinlichkeit von 3/7. Nur dass man in das Programm eine beliebig große Anzahl an Objekten dieser Klasse mit beliebig großen "Wahrscheinlichkeits-Zahlen" eingeben kann.
ich hoffe, dass ist halbwegs verständlich. Danke im Vorraus
3 Antworten
Man könnte die Objekte in einen Graph übertragen.
Ein Graph besteht aus Knoten, die jeweils eines deiner Objekte beinhalten. Mittels Kanten/Pfaden sind sie mit einem (leeren) Wurzelknoten verbunden, wobei jeder Pfad den Wahrscheinlichkeitswert für den Knoten beinhaltet, auf den er zeigt. Die Anzahl eines Objekts sollte ebenso außerhalb des Objekts selbst gelagert werden, bspw. im Knoten.
Das Modell einmal grob in Java angedeutet:
class Graph {
private Node root;
/* ... */
}
class Node {
private ArrayList<Edge> nextEdges;
private Edge previousEdge;
private Object someObject;
private int numberOfSomeObject;
/* ... */
}
class Edge {
private double probabilityValue;
private Node startNode;
private Node endNode;
/* ... */
}
Wenn die Häufigkeit eines bestimmten Objekts geändert werden soll, muss das also über eine Methode des Graph erfolgen. Die könnte in diesem Zug auch über alle Kanten des Vorgängerknotens iterieren, um die Wahrscheinlichkeitswerte zu aktualisieren.
ist sicherlich nicht das was du brauchst aber vielleicht bringts dich auf ideen:
meine schritte:
- ich weiß dass die werte innerhalb der objekte (welche wiederum innerhalb der collection sind) die wahrscheinlichkeit beeinflussen. diese nenne ich jz x.
- deshalb erstelle ich eine sequenz wo das x von jedem objekt, x mal vorkommt. (bsp.: objekt.x=2, objekt.x=3 -> [2,2,3,3,3]).
- selektiere random ein wert aus der sequenz. die werte x, die höher sind haben automatisch eine höhere wahrscheinlichkeit selektiert zu werden, da sie öfter vorkommen. (beispiel von vorhin: [2,2,3,3,3] -> 2 = 40%, 3 = 60% von 5 items in der sequenz.)
var xList = objList.stream() // sequenz erstellen wo x, x mal vorkommt
.map(obj -> obj.x) // erstelle sequenz aus x
.distinct() // entferne duplikate von x
.flatMap(i -> IntStream.of(0, i).map(__ -> i).boxed()) // x soll x mal vorkommen
.toList();
var randomValue = xList.get(random.current().nextInt(xList.size()));
Kann sein dass ich hier was falsch verstanden habe, aber du speicherst einfach in einem extra Feld die Summe der Zahlen des Arrays und berechnest die Wahrscheinlichkeit an Feld I indem du A[I] durch die Summe teilst?
Hm. Ich verstehe leider nicht wirklich was du machen möchtest.
Das sollte an sich gehen, ja. Also die Wahrscheinlichkeit der einzelnen Objekte hätte ich dann. Und dann mit util.Random.nextDouble() vergleichen um "das Rad zu drehen" sage ich mal? oder geht das auch anders?