Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Random im Zusammenspiel mit Wahrscheinlichkeit

1,730 views
Skip to first unread message

Yoshi2k86

unread,
May 31, 2010, 4:50:17 AM5/31/10
to
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:

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.

Michael Paap

unread,
May 31, 2010, 6:14:11 AM5/31/10
to
Am 31.05.2010 10:50, schrieb Yoshi2k86:

> 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

Jan Torben heuer

unread,
May 31, 2010, 10:02:41 AM5/31/10
to
Yoshi2k86 wrote:

> 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

Tor-Einar Jarnbjo

unread,
May 31, 2010, 7:12:29 PM5/31/10
to
Yoshi2k86 schrieb:

> 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

Heiner Kücker

unread,
Jun 1, 2010, 7:13:59 AM6/1/10
to
Tor-Einar Jarnbjo schrieb:
> 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.

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

Paul Ebermann

unread,
Jun 5, 2010, 8:58:45 AM6/5/10
to
Am 01.06.2010 13:13, schrieb Heiner K�cker:
> Tor-Einar Jarnbjo schrieb:
>> 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.

>
> Verdammt, kannte ich nicht.
> Ach so, gibt es erst ab 1.6

Vorher k�nntest du map.tailMap(Math.random()).getFirst() nehmen.

Paul

Heiner Kücker

unread,
Jun 7, 2010, 6:08:41 AM6/7/10
to
Paul Ebermann schrieb:

> Am 01.06.2010 13:13, schrieb Heiner K cker:
>
> > Tor-Einar Jarnbjo schrieb:
> >> 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.
>
> > Verdammt, kannte ich nicht.
> > Ach so, gibt es erst ab 1.6
>
> Vorher konntest du map.tailMap(Math.random()).getFirst() nehmen.

Ach so, ja.

Das sollte auch genauso performant sein,
denn tailMap liefert eine View, keinen Clone
der originalen Map.

> Paul

Grüsse
Heiner

0 new messages