Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Prozentrechnung für...

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Computer-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 03.10.2013, 16:05    Titel: Prozentrechnung für... Antworten mit Zitat

Hallo,

ich steh gerade auf dem Schlauch, ich brauch einen Formel (wird sicherlich nicht allzu kompliziert sein) die aus:

dem alten Prozentwert
einen neuen Prozentwert
und der Anzahl der Werte die zum alten Wert geführt haben

einen neuen Prozentwert errechnet.

Also so:

Code:
      function plugin_rate() {
         if (isset($_GET['rate']) and isset($_POST['uid']) and isset($_POST['val'])) {
            if (is_numeric($_POST['val']) and is_numeric($_POST['uid'])) {
               $uid = $_POST['uid'];
               $val = $_POST['val'];
               $erg = mysql_query("SELECT proc, hits FROM userprofile WHERE uid = '$uid' LIMIT 1;");
               if (mysql_num_rows($erg)) {
                  $row = mysql_fetch_object($erg);
                  //neu berechnen & update
               }
            }
         }
      }


$row->hits wäre dann die Anzahl, $row->proc der alte Wert und $val der Neue.

Kann mir jemand helfen?

Die Möglichkeit einfach alle Werte zu speichern fällt aus, da ich bereits Werte habe. Nur habe ich es damals so gemacht, dass es als Rate nur true/false gab und ich das Verhältnis davon in % ausgedrückt hab (geht um den kompletten Neuaufbau eines Webprojektes, die alten Prozentwerte hab ich nur in der DB weil ich aus Performancegründen diese Berechnung gecached habe). Also kann ich dadraus die fehlenden Werte nicht ableiten und wär mir auch lieb wenn die "rate-wert-Tabelle" einfach verschwindet, wegen Speicher und Performance, so dass ich gleich den %-Wert habe.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 03.10.2013, 17:13    Titel: Antworten mit Zitat

Ich weiß jetzt leider nicht genau, welche Voraussetzungen gegeben und welche gesucht sind, daher tue ich mir schwer mit der Beantwortung der Frage. Wegen des erwähnten "true/false" schätze ich mal, es geht um Folgendes:
Du hast eine Anzahl von Werten, von denen eine bestimmte Zahl "true" ist und der Rest "false". also z. B. 100 "gespeicherte" Werte, von denen 78% "true" sind. Dazu kommen jetzt weitere (z. B.) 50 Werte, von denen 24% "true" sind. Du weißt die Gesamtzahlen 100 und 50 sowie die Prozentsätze 78% und 24%. Du willst die neue Gesamtzahl 150 und den neuen Prozentsatz 60% wissen. Ist meine Vermutung soweit richtig?
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 03.10.2013, 17:31    Titel: Antworten mit Zitat

Nein, sorry. Also mit True & False das war einmal. Nun soll der Benutzer die Möglichkeit haben eine Wertigkeit von 0 - 100 zu vergeben und diese soll zum neuen Prozentwert führen.

Da ich es aber davor mit true/false gemacht habe, ist das etwas völlig Neues. Alles was ich jetzt noch habe ist die Anzahl der Ratings, den alten Prozentwert und das neue Rating (0-100).

Nun soll anhand des alten Prozentwerts und der Anzahl der Ratings das Neue eingerechnet werten wenn der User es abschickt.

Also bsp:

alter Wert: 78.5%
Ratings: 50
Usereingabe: 50%


So dass nun 78,5% dementsprechend absinkt. Ich hab echt keine Idee.

Das mit true & false hab ich noch mit hingeschrieben, damit man weiß wie die alten Werte zustande kamen. Ansonsten könnte ich ja einfach jeden Rate speichern und den Durchschnitt mit dem arithmetischen Mittel bestimmen, aber das wäre ja nicht mehr kompatibel. Aber ohne jeden Wert zu speichern wär mir sowieso lieber.
Wollte damit keine Verwirrung stiften.

Danke lächeln

Edit: Obwohl Möglich wäre es doch wenn ich false = 0% und true = 100% mache, aber wie gesagt ohne die Tabelle wär mir das am allerliebsten. (Die hat jetzt schon ~300.000 Einträge.)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 03.10.2013, 17:41    Titel: Antworten mit Zitat

Ok, damit lässt sich schon was anfangen.
(AlteBenutzerzahl*AlterProzentwert + NeuerProzentWert) / (AlteBenutzerzahl + 1)
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 03.10.2013, 17:50    Titel: Antworten mit Zitat

Ja. Ist genau das was ich brauche. Hab mal 2 Beispiele gerechnet:

Zitat:
(0 * 0 + 100) / (0 + 1) = 100
(1 * 50 + 25) / (1 + 1) = 37,5



Danke! lächeln

Edit:

Mal hier das ganze in PHP implementiert, falls es für jemanden relevant ist. Ich freu mich nämlich gerade, in der alten Version hatte ich das mit Durchschnitt gelöst.. So ist s alle mal "smarter".

Code:
      function plugin_rate() {
         if (isset($_GET['rate']) and isset($_POST['uid']) and isset($_POST['val'])) {
            if (is_numeric($_POST['val']) and is_numeric($_POST['uid'])) {
               $uid = $_POST['uid'];
               $val = $_POST['val'];
               $erg = mysql_query("SELECT proc, hits FROM userprofile WHERE uid = '$uid' LIMIT 1;");
               if (mysql_num_rows($erg)) {
                  $row = mysql_fetch_object($erg);
                  $proc =   ($row->hits * $row->proc + $val) / ($row->hits + 1);
                  mysql_query("UPDATE userprofile SET proc = '$proc', hits = hits + 1 WHERE uid = '$uid';");
               }
            }
         }
      }
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 04.10.2013, 05:52    Titel: Antworten mit Zitat

Wäre es nicht einfacher und auch mathematisch sinnvoller, in einer Variablen die Summe aller Prozentsätze und in einer zweiten Variablen die Zahl aller Benutzer zu speichern und daraus dann den Durchschnitt auszurechnen? Bei der Formel von nemored wird ja mit

AlteBenutzerzahl*AlterProzentwert

die Summe aller Prozentsätze jedesmal aus dem Durchschnitt und der Benutzerzahl zurückgerechnet, da dürfte sich im Laufe der Zeit einiges an Rundungsfehlern ansammeln.

mfG
grindstone
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 04.10.2013, 09:22    Titel: Antworten mit Zitat

Nur eine kleine Notiz am Rande: dein PHP Code scheint mir sehr anfällig für klassische SQL Injection Angriffe zu sein. Prepared Statements für SQL Queries sollten heutzutage eigentlich Standard sein. siehe auch http://php.net/manual/en/mysqlinfo.api.choosing.php
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 04.10.2013, 10:31    Titel: Antworten mit Zitat

Guter Hinweis. In diesem speziellen Fall hat er immerhin mit is_numeric eine Verteidigungslinie eingezogen. Bei Strings bzw. nicht streng validierten Eingaben hingegen muss man immer escapen oder eben generell irgendeine DB-Abstraktion benutzen, die das für einen indirekt automatisch übernimmt.
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 05.10.2013, 17:03    Titel: Antworten mit Zitat

ORMs setzen sich in der PHP-Welt nur sehr langsam durch, wie mir scheint. Selbst in großen und bekannten Projekten wird blankes SQL eingesetzt (ownCloud, Drupal, Wordpress, ...)... mir komplett unverständlich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Computer-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz