Java. Zufallsgenerator, abhängig vom Int-Feld einer Klasse?

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:

  1. ich weiß dass die werte innerhalb der objekte (welche wiederum innerhalb der collection sind) die wahrscheinlichkeit beeinflussen. diese nenne ich jz x.
  2. 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]).
  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?


aaricampari 
Beitragsersteller
 07.06.2024, 20:16

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?