Wenn Sie‘ Ich werde die Suche nur einmal (oder ein paar Mal) machen, dann ist die answer by @fabian gut.
Wenn Sie jedoch viel unternehmen, ist die von dieser Lösung durchgeführte sequenzielle Suche nicht effizient.
Für eine effizientere Lösung benötigen Sie eine gezieltere Suche, so dass Sie die Daten nach der kumulativen Chance organisieren müssen. Dies kann als ein Array unter Verwendung der binären Suche oder als NavigableMap
erfolgen, die durch die kumulative Wahrscheinlichkeit codiert ist.
Mit einem NavigableMap
wie TreeMap
, können Sie dann higherEntry(K key)
verwenden das ausgewählte Objekt zu finden:
Gibt einen Schlüssel-Wert-Zuordnung mit dem geringsten Schlüssel zugeordnet ist strikt größer ist als der vorgegebene Schlüssel oder null
wenn es ist kein solcher Schlüssel.
Also hier ist, Beispielcode:
public class MyObj {
private final String name;
private final int weight;
public MyObj(String name, int weight) {
this.name = name;
this.weight = weight;
}
public String getName() {
return this.name;
}
public int getWeight() {
return this.weight;
}
@Override
public String toString() {
return this.name;
}
public static void main(String[] args) {
// Build list of objects
List<MyObj> list = Arrays.asList(
new MyObj("A", 2),
new MyObj("B", 6),
new MyObj("C", 12)
);
// Build map keyed by cumulative weight
NavigableMap<Integer, MyObj> weighedMap = new TreeMap<>();
int totalWeight = 0;
for (MyObj obj : list) {
totalWeight += obj.getWeight();
weighedMap.put(totalWeight, obj);
}
System.out.println(weighedMap);
// Pick 20 objects randomly according to weight
Random rnd = new Random();
for (int i = 0; i < 20; i++) {
int pick = rnd.nextInt(totalWeight);
MyObj obj = weighedMap.higherEntry(pick).getValue();
System.out.printf("%2d: %s%n", pick, obj);
}
}
}
Beispielausgabe
{2=A, 8=B, 20=C}
14: C
10: C
9: C
5: B
11: C
3: B
1: A
0: A
1: A
7: B
4: B
11: C
17: C
15: C
4: B
16: C
9: C
17: C
19: C
2: B
, dass es genau das ist! Ich weiß nicht, wie ich vergessen habe, an so etwas zu denken, danke. – Reymmer