Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: WebStyleBoard. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Donnerstag, 15. November 2007, 15:14

rand() + Gewichtung von Datensätzen

hi und tachchen :)

ich plage mich gerade zwar nicht wirklich, aber hab auch keine Idee immo dazu ...

am besten lässt sich das Problem anhand einer Bannerverwaltung erklären

- 10 Banner in einer Datenbank
- bei einem Aufruf soll ein Banner zuuuufällig ausgewählt werden
- jetzt möchte ich aber einige Banner zuuuufäälliger als zufällig ausgeben lassen

zu jedem Banner soll eine Gewichtung von 1 (unwichtig) bis 5 (wichtig) angegeben werden und da sollen natürlich die wichtigen öfter zufällig erscheinen

jemand ne Idee wie man das am sinnvollsten angeht?
Signatur von »TheNobody Style«

2

Donnerstag, 15. November 2007, 15:29

Hi TNS,

um ein wenig WSB-Aktivität zu simulieren, hier mal ne kurze Idee meinerseits...

Du speicherst ja zusammen mit den Bannerdaten die Priorität des Banners. Die Gewichtung der Priorität würde ich wie folgt machen:

PHP-Quelltext

1
2
3
#Gewichtung ermitteln
$gewicht '555554444333221';
$gewichtung $gewicht{rand(014)}


Auf diese Weise wird zwar eine Gewichtung zufällig gewählt, aber die Wahrscheinlichkeit der Auswahl steigt entsprechend mit der Priorität:

Priorität 1 = 1/15 = 6,7%
Priorität 2 = 2/15 = 13,3%
Priorität 3 = 3/15 = 20%
Priorität 4 = 4/15 = 26,7%
Priorität 5 = 5/15 = 33,3%

[UPDATE]

Du solltest Dir das Auswählen der Gewichtung und die Wahl des Banners in eine Funktion packen, welche sich selbst aufruft, wenn kein Banner mit der gewählten Priorität gefunden wurde.

Auf diese Weise stellst Du sicher, dass die Funktion immer einen Banner liefert, auch wenn es nicht für jede Priorität einen Banner in der Datenbank gibt

[/UPDATE]
Signatur von »LapisInfernalis« Eine Milde Gabe...

Der Horizont vieler Menschen ist ein Kreis mit dem Radius Null - und das nennen sie ihren Standpunkt.

Albert Einstein (1879-1955)

A common mistake people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools.
Douglas Adams (1952-2001)

3

Donnerstag, 15. November 2007, 15:42

das Problem daran ist: du setzt vorraus, dass es für jedes Gewicht auch einen Banner gibt :undecided:

angenommen es gibt
5x Gewicht 1
3x Gewicht 3
2x Gewicht 5

grr ... das hatte ich vor deinem [UPDATE] getippt gehabt ...

Von der Idee her mag das gut sein, aber von der praktischen Seite eher nicht .. weil es jede Menge ergebnislose Abfragen gäbe ... is performancetechnisch sicher net so der Knaller :rolleyes:
Signatur von »TheNobody Style«

4

Donnerstag, 15. November 2007, 15:46

Wieso unperformant? Du kannst ja mit dem Wiederaufruf der Funktion auch die letzte gewählte Priorität mit übergeben und dafür sorgen, dass diese Gewichtung beim zweiten Durchgang nicht mehr berücksichtigt wird.

Auf diese Weise hast Du maximal 5 Abfragen... ;)
Signatur von »LapisInfernalis« Eine Milde Gabe...

Der Horizont vieler Menschen ist ein Kreis mit dem Radius Null - und das nennen sie ihren Standpunkt.

Albert Einstein (1879-1955)

A common mistake people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools.
Douglas Adams (1952-2001)

5

Samstag, 24. November 2007, 08:56

bei 1000 Aufrufen sind das ja auch nur max. 4000 überflüssige Abfragen :suspicious: :tongue:

keiner noch ne kleiner feine Idee? :disappointed:
Signatur von »TheNobody Style«

6

Samstag, 24. November 2007, 15:38

Zugegeben, da hast Du natürlich Recht... Allerdings wüsste ich nicht, wie man dieses Problem sonst lösen könnte. Bin mal gespannt ob jemand eine bessere Idee hat.

Um die zusätzlichen Abfragen zu minimieren, könntest Du auch folgendes machen:

Anstatt:

PHP-Quelltext

1
2
3
#Gewichtung ermitteln
$gewicht '555554444333221';
$gewichtung $gewicht{rand(014)}


lässt Du die Variable $gewicht dynamisch erstellen:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#Gewichtung ermitteln
$gewicht '';

$query "SELECT gewichtung FROM tabelle GROUP BY gewichtung ORDER BY gewichtung ASC";
$result mysql_query($query);

while($data mysql_fetch_object($result))
    {
    for($i 0$i $data->gewichtung$i++)
        {
        $gewicht .= $data->gewichtung;
        }
    }

$length strlen($gewicht)-1;

$gewichtung $gewicht{rand(0$length)};


Auf diese Weise hast Du zwei Abfragen, aber es kann so nicht dazu kommen, dass eine Banner-Abfrage ein leeres Ergebnis liefert.

Du könntest das Ergebnis auch irgendwo zwischenspeichern und mit dem Bannercode übergeben, und diesen String immer nur dann aktualisieren, wenn sich der Bestand an Bannern ändert...

Dann bist Du wieder bei einer einzigen DB-Abfrage pro Banner... ;) So besser? :P
Signatur von »LapisInfernalis« Eine Milde Gabe...

Der Horizont vieler Menschen ist ein Kreis mit dem Radius Null - und das nennen sie ihren Standpunkt.

Albert Einstein (1879-1955)

A common mistake people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools.
Douglas Adams (1952-2001)