maik87
Goto Top

Nächstgelegenen Wert ermitteln

Hallo Leute,

ich weiß nicht, wie ich mein Problem genau beschreiben soll. Ich versuche es mal anhand eines täglichen Beispiels zu erklären:

Wir stellen uns mal vor, es würde eine Schätzfrage geben.

Wie viele Kilometer Entfernung sind es von der Erde zur Sonne?
Richtige Antwort: 149,6 Mio. km
Kandidat 1: 10 Mio km
Kandidat 2: 200 Mio km
Kandidat 3: 101 Mio km
...

Wie könnte ich am unkompliziertesten ermitteln, wer die Schätzfrage gewonnen hat? Gibt es eine Funktion oder muss ich das ganze durch eine Schleife jagen?

Content-Key: 207079

Url: https://administrator.de/contentid/207079

Printed on: April 19, 2024 at 14:04 o'clock

Member: falscher-sperrstatus
falscher-sperrstatus May 27, 2013 at 13:13:39 (UTC)
Goto Top
Eine Funktion wird es dafür wohl nicht geben. Von daher die Differenz vergleichen als eigene Funktion.
Member: colinardo
colinardo May 27, 2013 updated at 13:19:30 (UTC)
Goto Top
Hi,
zieh doch den Betrag von jedem Kandidaten von der Lösung ab schreib den Kanidat und den "absoluten" Wert zusammen in ein Array und sortiere dieses von klein nach groß. Der der am nächsten dran liegt steht dann an Position 1 des Arrays.

Grüße Uwe
Member: Honksen
Honksen May 27, 2013 at 13:28:38 (UTC)
Goto Top
Hai,

vergleiche in einer Schleife die Werte mit der richtigen Lösung. Bilde die Differenz und danach den Betrag (falls negative Ergebnisse herauskommen). Vergleiche jeden mal 2 Werte. Den kleineren Werte (also näher an der Lösung) behälts Du in einer Variablen.
Wenn alle Werte einzeln verglichen sind, hast Du denjenigen, der am besten geschätzt hat.

Honksen
Member: Maik87
Maik87 May 27, 2013 at 13:44:10 (UTC)
Goto Top
Also gaaanz quick and dirty:

$antworten=array();
$antworten['Kandidat_01'] = 10;
$antworten['Kandidat_02'] = 200;
$antworten['Kandidat_03'] = 101;

$richtig = 149.6;

$entfernung = array();

foreach ($antworten as $key => $antwort){
$entfernung[$key] = abs($richtig-$antwort);
}

asort($entfernung);

echo 'Gewinner: ' .array_search(reset($entfernung),$entfernung);

Optimierung folgt face-smile
Member: peter-
peter- May 27, 2013 at 13:47:07 (UTC)
Goto Top
Hi,

am Rande bemerkt:

Es mag der Sonderfall auftreten, das 2 oder mehrere Kandidaten absolut gesehen gleiche Schätzungen abgeben. Daran sollte man dann auch denken. Uwe's Array könnte man entsprechend abfragen, Honksen's Lösung läßt vermutlich nur den ersten besten Schätzer gewinnen.
Member: Maik87
Maik87 May 27, 2013 updated at 13:56:25 (UTC)
Goto Top
Danke für den Einwand!
Mitglied: 64748
64748 May 27, 2013 updated at 14:22:42 (UTC)
Goto Top
Hallo,

die Lösung mit dem Array ist im Prinzip richtig. Allerdings würde ich anstatt eine Schleife zu durchlaufen die Werte nach den Differenzen Sortieren. Wie das mit PHP geht weiß ich nicht. Aber dann kannst Du prüfen, ob die beiden ersten Werte identisch sind (also im sortierten Array), wenn ja, dann gibt's mehr als eine richtige Antwort.

Markus
Member: Maik87
Maik87 May 27, 2013 at 14:14:07 (UTC)
Goto Top
Zitat von @64748:

die Lösung mit dem Array ist im Prinzip richtig. Allerdings würde ich anstatt eine Schleife zu durchlaufen die Werte
nach den Differenzen Sortieren.

Mach ich doch, oder?
In der Schleife rechne ich die Differenzen aus, dann sortiere ich die Differenzen aufsteigend und nehm den ersten Wert. Klar kann man noch eine Schleife hinterhängen, die - soforn es x gleiche richtige Antworten gibt - alle ausgibt.
Mitglied: 64748
64748 May 27, 2013 at 14:21:11 (UTC)
Goto Top
Ach so, ich hatte das anders gesehen.

Markus
Member: Maik87
Maik87 May 27, 2013 at 14:24:54 (UTC)
Goto Top
und wie hast du es gesehen??
Mitglied: 64748
64748 May 27, 2013 at 14:34:54 (UTC)
Goto Top
Ich hatte das so aufgefasst, dass der Vergleich in der Schleife vorgenommen wird.

Ich würde, wenn ich sowas programmiere (mit Perl, PHP kann ich nicht) mir eine Funktionen schreiben "differenz", die den Betrag der Differenz zweier Zahlen zurückgibt. Wenn man die Antworten gleich in einem Array sammelt, dann braucht man eigentlich keine Schleife mehr.
sort { differenz($antworten[$a], $richtigerwert <=> differenz($antworten[$b], $richtigerwert } ;
Oder z.B. eine Sortierfunktion, die den korrekten Lösungswert und eine Referenz auf das Array als Argument bekommt. Ich halte das für übersichtlicher als eine Schleife. Wie gesagt, Perl.

Markus