ich stehe vor folgender Aufgabe: Ich habe eine X-Anzahl von Objekten
und möchte nun durch Zufall eines dieser Objekte auswählen. Jedes
dieser Objekte hat eine bestimmte Wahrscheinlichkeit die ich mit in
die Auswahl fließen lassen möchte. Beispiel:
Objekt A (Wahrscheinlichkeit 60%)
Objekt B (Wahrscheinlichkeit 25 %)
Objekt C (Wahrscheinlichkeit 15 %)
Nun soll also zufällig ein Objekt ausgewählt werden, aber die drei
sollen nicht gleichberechtigt sein, sondern eben einen Vorteil je nach
ihrer Wahrscheinlichkeit haben. Kann ich das irgendwie über die Random-
Klasse von Java realisieren? Wenn ja, wie? Bin euch für eure Hilfe
dankbar.
> ich stehe vor folgender Aufgabe: Ich habe eine X-Anzahl von Objekten
> und m�chte nun durch Zufall eines dieser Objekte ausw�hlen. Jedes
> dieser Objekte hat eine bestimmte Wahrscheinlichkeit die ich mit in
> die Auswahl flie�en lassen m�chte. Beispiel:
>
> Objekt A (Wahrscheinlichkeit 60%)
> Objekt B (Wahrscheinlichkeit 25 %)
> Objekt C (Wahrscheinlichkeit 15 %)
>
> Nun soll also zuf�llig ein Objekt ausgew�hlt werden, aber die drei
> sollen nicht gleichberechtigt sein, sondern eben einen Vorteil je nach
> ihrer Wahrscheinlichkeit haben. Kann ich das irgendwie �ber die Random-
> Klasse von Java realisieren? Wenn ja, wie? Bin euch f�r eure Hilfe
> dankbar.
Erzeuge eine Zufallszahl zwischen 0 und 99.
Ist sie < 60 --> Objekt A.
Ist sie >= 60 und < 85 --> Objekt B.
Ist sie >= 85 --> Objekt C.
Gru�,
Michael
> Hallo zusammen,
>
> ich stehe vor folgender Aufgabe: Ich habe eine X-Anzahl von Objekten
> und möchte nun durch Zufall eines dieser Objekte auswählen. Jedes
> dieser Objekte hat eine bestimmte Wahrscheinlichkeit die ich mit in
> die Auswahl fließen lassen möchte. Beispiel:
Ungefähr so gehts (ggf. für deine Anforderung anpassen):
public static int randomIndex(double[] propabilities, double randomValue) {
double sum = 0;
for (double d : propabilities) {
sum += d;
}
/* excluding 0 but not 1! */
double randomvalue = (1 - randomValue) * sum;
for (int i = 0; i < propabilities.length; i++) {
if (randomvalue < propabilities[i]) {
return i;
} else {
randomvalue -= propabilities[i];
}
}
/* everything was zero */
return -1;
}
Jan
> Objekt A (Wahrscheinlichkeit 60%)
> Objekt B (Wahrscheinlichkeit 25 %)
> Objekt C (Wahrscheinlichkeit 15 %)
>
> Nun soll also zuf�llig ein Objekt ausgew�hlt werden, aber die drei
> sollen nicht gleichberechtigt sein, sondern eben einen Vorteil je nach
> ihrer Wahrscheinlichkeit haben. Kann ich das irgendwie �ber die Random-
> Klasse von Java realisieren? Wenn ja, wie? Bin euch f�r eure Hilfe
> dankbar.
Statt das Rad (die Schleife) neu zu erfinden, kannst du das relativ
einfach mit einem TreeMap implementieren (hier mit Strings als Beispiel,
aber du kannst nat�rlich auch andere Objekttypen als Wert benutzen):
TreeMap<Double, String> map = new TreeMap<Double, String>();
map.put(0.60, "A"); // 60% wahrscheinlichkeit
map.put(0.85, "B"); // 25% noch drauf
map.put(1.00, "C"); // weitere 15% drauf
Falls du deinen Zufallsgenerator nicht besonders initialisieren musst,
kannst du jetzt auch die Utility-Methode Math.random() benutzen, um
Zufallszahlen im Bereich [0,1> zu erhalten:
String zufallsstring = map.ceilingEntry(Math.random()).getValue();
Die Methode ceilingEntry gibt dir ein Map.Entry f�r den kleinsten
Schl�ssel, der gr��er oder gleich den �bergebenen Wert ist. Ist die
R�ckgabe von Math.random() im Bereich [0, 0,6] kommt also "A" raus, im
Bereich <0,6, 0,85] "B" und im Bereich <0,85, 1> "C".
Gru�, Tor
Verdammt, kannte ich nicht.
Ach so, gibt es erst ab 1.6
Für Java vor 6
http://heinerkuecker.de/RangeMap.html
> Gruß, Tor
Grüsse
Heiner
Vorher k�nntest du map.tailMap(Math.random()).getFirst() nehmen.
Paul
Ach so, ja.
Das sollte auch genauso performant sein,
denn tailMap liefert eine View, keinen Clone
der originalen Map.
> Paul
Grüsse
Heiner