Suche Tipp: "gewichtete" Zufallszahlen

Benutzeravatar
tracer
Operator
Operator
Beiträge: 63851
Registriert: 18.08.2004 18:50:03
Wohnort: Kollmar
Has thanked: 5 times
Been thanked: 4 times
Kontaktdaten:

#1 Suche Tipp: "gewichtete" Zufallszahlen

Beitrag von tracer »

Mal ne Frage/Bitte an die Mathematiker:

Ich habe ja die Verwaltung der Bannersoftware neu geschrieben.

Es gibt Banner, die ganz normal in der Rotation sind, welche, die in Relation doppelt so häufig eingeblendet werden sollen, und welche, die 3x so häufig eingeblendet werden sollen.

Dafür habe ich ein Feld "weight", mit Werten von 33, 66 oder 99.

Das SQL Statement sieht so aus:

Code: Alles auswählen

        $sql = "SELECT * FROM rhf_banners WHERE status = 1 AND location = 2 ORDER BY weight * SUBSTR(RAND(),6,2) DESC";
Macht leider nicht wirklich das, was es soll.

Hat jemand ne Idee, was ich übersehe?
Oder wie ich das besser lösen könnte?
speedy
Beiträge: 9028
Registriert: 22.10.2004 10:45:57
Wohnort: Stuttgart
Kontaktdaten:

#2

Beitrag von speedy »

Hi,

ich hab zwar (noch) keine Lösung für dein Problem (hab allerdings schon nen Ansatz einer Idee :D, der noch bißchen garen muß) - aber mir ist nicht so wirklich klar, wofür du die Zufallszahlen brauchst ? ... dann könnt es dir ja passieren, daß Banner eines Partners (fast) nie aufgerufen werden, weil die Zufallszahlen so dumm fallen.


MFG,
speedy
Benutzeravatar
tracer
Operator
Operator
Beiträge: 63851
Registriert: 18.08.2004 18:50:03
Wohnort: Kollmar
Has thanked: 5 times
Been thanked: 4 times
Kontaktdaten:

#3

Beitrag von tracer »

wofür du die Zufallszahlen brauchst ?
Na, die sollen ja "zufällig" kommen, und das in einer bestimmten Häufigkeit.
Benutzeravatar
bvtom
Beiträge: 1833
Registriert: 01.05.2007 17:02:31

#4

Beitrag von bvtom »

Ich kenn mich mit deiner Forensoftware nicht aus und SQL hab ich auch vor ca 15 Jahren das letzte mal gesehen.

Aber warum trägst du die Banner die du häufiger willst nicht einfach mehrfach in die DB (oder in ne Indexliste) ein. Und dann nur noch ne Zufallszahl zwischen 0 und der max. Anzahl der Einträge bzw. Indizes generiert und das dort eingetragene Banner angezeigt.
Gruß
Tom

wer weiß dass er nichts weiß, weiß immer noch mehr als der, der nicht weiß dass er nichts weiß.
Flotte: Mal mehr , mal weniger
Heck- und Seitenschweben
Benutzeravatar
tracer
Operator
Operator
Beiträge: 63851
Registriert: 18.08.2004 18:50:03
Wohnort: Kollmar
Has thanked: 5 times
Been thanked: 4 times
Kontaktdaten:

#5

Beitrag von tracer »

Aber warum trägst du die Banner die du häufiger willst nicht einfach mehrfach in die DB (oder in ne Indexliste) ein. Und dann nur noch ne Zufallszahl zwischen 0 und der max. Anzahl der Einträge bzw. Indizes generiert und das dort eingetragene Banner angezeigt.
Hatte ich auch schon überlegt, finde ich aber irgendwie "unelegant", und es macht die Generierung der Statistiken aufwändiger.

Ausserdem kostet es mich dann noch mehr Rechenzeit, sicherzustellen, dass keine Banner doppelt ausgeliefert werden.
Benutzeravatar
bvtom
Beiträge: 1833
Registriert: 01.05.2007 17:02:31

#6

Beitrag von bvtom »

War ja auch nur ne Idee so nach dem Motto "kis" (keep it simple).

Die Statistiken aber wären kein Problem. Einfach ein zusätzliches Feld hinterlegt in dem du nen Zähler ablegst. Wenn du über Index zugreifst passt das.

Gut wenn du die Banner nicht doppelt anzeigen willst bedeutet das natürlich Aufwand. Ein einfaches Flag "in Zugriff" hilft da aber schon.
Nur hast du ein anderes Prob:
Dadurch dass du eine Anzeige blockierst verbiegst du Häufigkeit bzw. deine angestrebte Gewichtung.
Gruß
Tom

wer weiß dass er nichts weiß, weiß immer noch mehr als der, der nicht weiß dass er nichts weiß.
Flotte: Mal mehr , mal weniger
Heck- und Seitenschweben
Flyfrog
Beiträge: 1840
Registriert: 15.11.2005 17:48:54

#7 Re: Suche Tipp: "gewichtete" Zufallszahlen

Beitrag von Flyfrog »

tracer hat geschrieben: Das SQL Statement sieht so aus:

Code: Alles auswählen

        $sql = "SELECT * FROM rhf_banners WHERE status = 1 AND location = 2 ORDER BY weight * SUBSTR(RAND(),6,2) DESC";
Micha, ich hab keine Ahnung was Du da schreibst,

aber um auf die Frage imThreadtitel zu antworten:

367648 -> 15kg


Ich hoffe ich konnte helfen 8)
Gruß H.
Benutzeravatar
tracer
Operator
Operator
Beiträge: 63851
Registriert: 18.08.2004 18:50:03
Wohnort: Kollmar
Has thanked: 5 times
Been thanked: 4 times
Kontaktdaten:

#8

Beitrag von tracer »

War ja auch nur ne Idee so nach dem Motto "kis" (keep it simple).
Das versuche ich ja auch immer.
Darum würde ich das gerne mit einem SQL-Statement erledigen, ohne viel Rechnerei im Backend.
Ein einfaches Flag "in Zugriff" hilft da aber schon.
Das müsste dann an die Session gebunden sein, auch wieder viel Rechnerei.
Benutzeravatar
tracer
Operator
Operator
Beiträge: 63851
Registriert: 18.08.2004 18:50:03
Wohnort: Kollmar
Has thanked: 5 times
Been thanked: 4 times
Kontaktdaten:

#9

Beitrag von tracer »

Ich hoffe ich konnte helfen
;)
speedy
Beiträge: 9028
Registriert: 22.10.2004 10:45:57
Wohnort: Stuttgart
Kontaktdaten:

#10

Beitrag von speedy »

Also - ich hab mal überlegt ... :D

Die Zufälligkeit brauchst du nicht denke ich (hab ich bei meinem System auch nicht) die kommt automatisch dadurch, daß unterschiedliche User/IPs unterschiedlich oft die Seiten aufrufen etc. und dadurch werden bei den einzelnen Usern dann verschiedene Banner von unterschiedlichen Partnern angezeigt. Was man natürlich noch einbauen muß ist, daß auf einer Seite nicht zweimal der gleiche Partner und/oder Banner angezeigt wird.

So ...

also durch die Banner/Partner gehst du mit einem Banner/Partner-Index. Wenn du willst, dann kannst den auch noch IP-abhängig machen. Ich hab bei mir dann noch einen "globalen" Startindex (max=max. Partner/Banner-ID) ... also bei eingeloggtem User 1 fängst mit Banner/Partner 1 an bei User 2 mit Partner 2 usw. - so hast du ne Rotation bzw. daß nicht die Startseite immer mit den gleichen Banner/Partner anfangen.

Ich nehm jetzt mal der einfachheithalber dafür den Namen "Banner-Index".

Beim Partner hinterlegst du eine Zahl von 1 bis x ... je höher die Zahl, um so niedriger die Gewichtung - in deinem Fall wär das 1-3.

Dann bei den Bannern eine Art Gewichtungsindex, der bei jedem Aufruf hochgezählt wird. Wie hoch - das hast du beim Partner hinterlegt.

Wenn GewichtungsIndex=0 wird das Banner angezeigt. Danach 1 hochgezählt. Wenn du das nächste mal durch die Banner/Partner gehst und das nächste anzuzeigende suchst und findest für Banner/Partner 1 den GewichtungsIndex 1 - und beim Partner steht 2 - dann zählst du den Index eines hoch ... wenn beim Partner die 1 drin steht, dann setzt du den Index auf 0 ... somit wird der Banner beim nächsten Mal wieder angezeigt .... demhingegen der Banner mit dem max. GewichtungsIndex von 2 oder 3 muß noch ein oder zwei Runden aussetzen, bis er wieder angezeigt wird.


War das verständlich wie ich das meine ?


MFG,
speedy
Benutzeravatar
tracer
Operator
Operator
Beiträge: 63851
Registriert: 18.08.2004 18:50:03
Wohnort: Kollmar
Has thanked: 5 times
Been thanked: 4 times
Kontaktdaten:

#11

Beitrag von tracer »

War das verständlich wie ich das meine ?
Ja, kostet aber auch wieder Leistung im Backend :(
Benutzeravatar
bvtom
Beiträge: 1833
Registriert: 01.05.2007 17:02:31

#12

Beitrag von bvtom »

Micha das Thema ist, dass du über ne Gewichtung alleine nicht hinkommst.
Du brauchst auch den Fall dass ein niedrig priorisiertes Banner mal "durchkommt".
Mal an nem Beispiel:
Du hast ein Banner der Kategorie a) Einfach;
Eins der Kategorie b ) Zweifach;
Und eins der Kategorie c) 3-fach;
Macht 6 Zustände: 1xa , 2xb und 3xc;

Hast du dagegen einmal a) einmal b) und zweimal c) sind das 9 Zustände.
Und genau das musst du abbilden.

Hinterleg also beim Werbepartner die Kategorie.
Bau dir dann automatisch ne statische Liste auf in den du den Index des Werbepartners der Kategorie entsprechend häufig einträgst.
Über die Zufallszahl und dem Eintrag in der Indexliste wird dann das entsprechende Banner ausgewählt. "Doppelpost" wird verhindert indem du einfach die 2. anzuzeigende Bannernummer vergleichst und solange eine neue Nummer generierst bis die Bannernummern ungleich sind.

Statistik machst du dann für jedes Banner. Die Indexliste ist nur ne Hilfsliste.

Leistung dürfte dies auch nicht übermässig kosten. Sind ja nur einfache Zugriffe. Lediglich die Prüfung auf ein doppeltes Banner und ggf. das erneute Auswählen kostet etwas.
Gruß
Tom

wer weiß dass er nichts weiß, weiß immer noch mehr als der, der nicht weiß dass er nichts weiß.
Flotte: Mal mehr , mal weniger
Heck- und Seitenschweben
Benutzeravatar
tracer
Operator
Operator
Beiträge: 63851
Registriert: 18.08.2004 18:50:03
Wohnort: Kollmar
Has thanked: 5 times
Been thanked: 4 times
Kontaktdaten:

#13

Beitrag von tracer »

Über die Zufallszahl und dem Eintrag in der Indexliste wird dann das entsprechende Banner ausgewählt. "Doppelpost" wird verhindert indem du einfach die 2. anzuzeigende Bannernummer vergleichst und solange eine neue Nummer generierst bis die Bannernummern ungleich sind.
Das ist aber wieder teuer auf der CPU :(
speedy
Beiträge: 9028
Registriert: 22.10.2004 10:45:57
Wohnort: Stuttgart
Kontaktdaten:

#14

Beitrag von speedy »

Das ist aber wieder teuer auf der CPU
Irgendwas ist halt immer ... wenn du das alles in SQL Statements packst, dann ist es auch teuer - aber eben im Speicher bzw. auch CPU - die DB läuft ja auch nicht nur mit Schall und Rauch.

Vielleicht kannst ja das Banner-Script auf einen der weniger frequentierten Server auslagern ?


MFG,
speedy
Ls4
Beiträge: 2037
Registriert: 19.07.2007 15:33:25
Wohnort: Mosbach

#15

Beitrag von Ls4 »

eine Prioritätswarteschalnge wäre ebenfals eine Lösung. als Priorität verwendest du die gewichtung und schreibst sie multipliziert mit einer zufallszahl in dei Warteschlange. dann kannst du nach und nach aus der warteschlange auslesen.
Ob das für dein Projekt sinnvoll ist weiß ich aber nciht, ich kenne ja die Intention und deinen Code nicht

Gruß Tim
T-Rex 450 SE V2 || Align 430 XL || Jazz 40-6-18 || 2*Kokam H5 3s1p 2100mah || LTG2100T+S9257 || Mx-22 || R700 || 3*Hs65MG

Depron F-18

Status: rumfetzen mit Kunstflug und leichten 3D einlagen

Der wo mal einen roten Heli hatte ;)
Antworten

Zurück zu „Klönschnack“