Zufälliges Objekt basierend auf Wahrscheinlichkeiten bekommen.

Bitte aktiviere JavaScript!
Hallo Zusammen,
Ich versuche zurzeit eine art "CaseOpening" zu schreiben,
Jedes Item hat eine eigene Wahrscheinlichkeit die "DropChance",
jedoch habe Ich keine Idee wie man ein Zufälliges Item basierend auf der dropchance bekommt.

Ich habe alle Items in einer ArrayList gespeichert und die wahrscheinlichkeit bekommt man mit "item.getDropChance()".

Ich würde mich freuen falls jemand eine Idee hätte!
Bei Fragen immer Fragen!
 
Hey Tarrew Ich denke Ich kann damit was anfangen!
und ich hoffe die Frage von Javinner ist damit auch geklärt.

Danke!
 
Was alle diese Beispiele letztlich aufbauen, ist eine "Cumulative Distribution Function" (CDF) zu den Wahrscheinlichkeiten der diskreten Zufallsvariable `X` gegeben als "Probability Mass Function". Die CDF gibt dann einfach an einem Punkt `x` die Wahrscheinlichkeit an, dass `X` kleiner gleich `x` ist. Somit kannst du einfach eine Zufallszahl `X` generieren und die CDF an dieser Stelle auswerten. Praktisch gesehen ist der Wert an dieser Stelle der erste Wert, der >= der Zufallsvariablen `X` ist.
Hier noch ein anderes Beispiel:
Java:
import static java.util.Arrays.asList;
import static java.util.Arrays.parallelPrefix;
import static java.util.stream.IntStream.range;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.ToDoubleFunction;
public class WeightedRandom {
  public static <T> T weightedRandom(List<T> values, ToDoubleFunction<T> weightFunction) {
    double[] cdf = values.stream().mapToDouble(weightFunction).toArray();
    parallelPrefix(cdf, (a, b) -> a + b);
    double rnd = ThreadLocalRandom.current().nextDouble();
    return range(0, cdf.length)
          .filter(i -> cdf[i] >= rnd * cdf[cdf.length - 1])
          .mapToObj(values::get)
          .findFirst().orElse(null);
  }

  public static void main(String[] args) {
    // Beispielklasse für ein Item
    class Item {
      final String name;
      final double dropChance;
      Item(String name, double dropChance) {
        this.name = name;
        this.dropChance = dropChance;
      }
      double getDropChance() {
        return dropChance;
      }
      public String toString() {
        return name;
      }
    }
    System.out.println(weightedRandom(asList(
        new Item("oft", 5),
        new Item("selten", 2),
        new Item("seltener", 0.5)
    ), Item::getDropChance));
  }
}
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben