Ingo Siemon: Beste Strategie für Zufallsbilder-Anzeige

Hallo

Ich habe in einem Ordner ca. 100 Bilder.
Nun möchte ich auf einer Webseite bei jedem Neu-Laden sieben dieser Bilder (per Zufall ausgewählt) anzeigen.
Dabei sollen natürlich immer sieben verschiedene Bilder aus dem Pool angezeigt werden, also keine doppelten.
Den Bildern kann ich übrigens beliebige Namen geben, also auch 1.jpg, 2.jpg usw., falls das nützlich ist.

Nun kommt es mir natürlich darauf an, dass das Script, welches dann die sieben Bilder anzeigt, möglichst schnell läuft, damit der User da keine Wartezeiten hinnehmen muss (Es handelt sich nämlich um eine Startseite).

Nun überlege ich, welche folgender beiden Wege der sinnvollere (schnellere) ist:

1.)
Per Script eine Zufallszahl erzeugen (zwischen 1 und 100) und die Bilder dann nach folgendem Muster anzeigen:
<img src=".../[Zufallszahl].jpg">
<img src=".../[Zufallszahl + 1].jpg">
<img src=".../[Zufallszahl + 2].jpg">
<img src=".../[Zufallszahl + 3].jpg">
.....

2.)
Den Inhalt des Bilder-Ordners per Script sozusagen auslesen lassen und die ausgewählten Bilder dann anzeigen.

Ich hoffe, man kann nachvollziehen, wie ich das ungefähr meine :)
Über Hilfe und ratschläge von Euch würde ich mich riesig freuen.

Gruß
Ingo

  1. Hi Ingo!

    Per Script eine Zufallszahl erzeugen (zwischen 1 und 100) und die Bilder dann nach folgendem Muster anzeigen:
    <img src=".../[Zufallszahl].jpg">

    Meiner Meinung nach wäre das die schnellste Variante. Aber warum erzeugst du nicht sieben unterschiedliche Zufallszahlen? Diese musst du dann natürlich auch miteinander abgleichen, damit keine doppelt vorkommt.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Tach H☼psel

      Meiner Meinung nach wäre das die schnellste Variante.

      OK, prima, das hatte ich mir auch schon fast gedacht.
      Ich wollte aber leieber noch mal ein paar Meinungen von euch Profis hier einfahren.

      Aber warum erzeugst du nicht sieben unterschiedliche Zufallszahlen?
      Diese musst du dann natürlich auch miteinander abgleichen,
      damit keine doppelt vorkommt.

      Tja, und genau da stösst meine PHP-Kompetenz schon wieder an seine Grenzen.
      Leider habe ich überhaupt keine Idee, wie ich sowas realisieren könnte.

      Gruß
      Ingo

      1. Hello out there!

        Meiner Meinung nach wäre das die schnellste Variante.
        OK, prima, das hatte ich mir auch schon fast gedacht.

        Wenn die andere Variante immer noch schnell genug ist, muss die schnellste Variante nicht die beste sein.

        Diese musst du dann natürlich auch miteinander abgleichen, damit keine doppelt vorkommt.
        Leider habe ich überhaupt keine Idee, wie ich sowas realisieren könnte.

        http://forum.de.selfhtml.org/archiv/2006/7/t133283/#m863404
        http://forum.de.selfhtml.org/archiv/2006/6/t131150/#m848153

        See ya up the road,
        Gunnar

        --
        “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
        1. Tach Gunnar

          Wenn die andere Variante immer noch schnell genug ist, muss die schnellste Variante nicht die beste sein.

          Was wären denn deiner Meinung nach die Vor- und Nachteile der beiden Varianten?

          Gruß aus Münster
          Ingo

          1. Hello out there!

            Was wären denn deiner Meinung nach die Vor- und Nachteile der beiden Varianten?

            Der Vorteil der Variante mit den fest vergebenen Dateinamen (1) ist die geringfügig(!!) schnellere Ausführung.

            Der Vorteil der anderen Variante (2) ist, dass du die Bilddateien nach deinem Belieben benennen kannst.

            Und was bei der Nummern-Variante (1), wenn die Bild 42.jpg nicht mehr gefällt? Du kannst es dann nicht einfach löschen, sondern müsstest ein anderes an seine Stelle setzen. Bei (2) musst du dir darüber keine Gedanken machen.

            See ya up the road,
            Gunnar

            --
            “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
            1. Tach Gunnar

              Der Vorteil der Variante mit den fest vergebenen Dateinamen (1) ist die geringfügig(!!) schnellere Ausführung.

              OK, und das ist mir fast das wichtigste.

              Der Vorteil der anderen Variante (2) ist, dass du die Bilddateien nach deinem Belieben benennen kannst.

              Das stellt meinerseits überhaupt keine Hürde dar, das in dem Ordner eh nur die anzuzeigenden Bilder sind und nix anderes.
              Und diese Bilder können ohne jegliche Probleme meinerseits bennat werden, wies für die Lösung am besten ist (so eben auch 1.jpg, 2.jpg, 3.jpg usw.).

              Und was bei der Nummern-Variante (1), wenn die Bild 42.jpg nicht mehr gefällt? Du kannst es dann nicht einfach löschen, sondern müsstest ein anderes an seine Stelle setzen. Bei (2) musst du dir darüber keine Gedanken machen.

              Auch das ist von meiner Seite kein Problem.
              Wenn ein Bild mal nicht mehr gefällt, wird es eh gegen ein anderes ersetzt.

              Ich habe hier mal einen witzigen Lösungsansatz gefunden:
              http://www.schattenbaum.net/php/random.php

              Und ich habe das auch gleich mal ausprobiert und zwar hier:
              http://spaceart.de/_Test2/index_V2.php
              Es geht dabei um diese schmalen senkrechten Bilder auf der Startseite.

              Aber es kommen ab-und-zu nun noch noch Bilder doppelt vor.
              Wie kann ich das denn da noch vermeiden?

              Gruß
              Ingo

              1. Hello out there!

                Der Vorteil der Variante mit den fest vergebenen Dateinamen (1) ist die geringfügig(!!) schnellere Ausführung.
                OK, und das ist mir fast das wichtigste.

                Was macht es für einen Unterschied, ob das Script 0.1 s oder 0.3 s Ausführungszeit braucht?

                Aber es kommen ab-und-zu nun noch noch Bilder doppelt vor.

                Die Wahrscheinlichkeit, bei 100 Bildern und 7 Ziehungen keine Duplikate zu erhalten, beträgt nur knapp über 80%.

                Bei n Bildern und k Ziehungen: [latex]P(n,k) = \frac{n \cdot (n-1) \cdot (n-2) \cdot … \cdot (n-k+1)}{n^k} = \frac {n!}{k! \cdot n^k}[/latex]

                Wie kann ich das denn da noch vermeiden?

                Mit einem Array. Weiteres siehe [wahsaga].

                Hier zeigt sich noch eine unschöne Seite des Konzepts der Variante (1) ohne Einlesen des Verzeichnisses: Wenn sich an den Bildern etwas ändert (welche dazukommen oder wegfallen), müsstest du jedesmal dein Script anpassen.

                Ich würde mich den enormen Gewinn an Flexibilität bei Variante (2) eine geringfügig längere Ausführungszeit des Scripts kosten lassen.

                See ya up the road,
                Gunnar

                --
                “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
                1. Hallo Gunnar

                  Ich würde mich den enormen Gewinn an Flexibilität bei Variante (2) eine geringfügig längere Ausführungszeit des Scripts kosten lassen.

                  Schau mal das hier an.
                  Ich denke, für meine Ansprüche gnügt das.

                  Gruß aus Münster
                  Ingo

                2. Hello out there!

                  Grmpf, falsch erweitert.

                  [latex]P(n,k) = \frac{n \cdot (n-1) \cdot (n-2) \cdot … \cdot (n-k+1)}{n^k} = \frac {n!}{(n-k)! \cdot n^k}[/latex]

                  Wie gut, dass es keine Steuern gibt ... ;-)

                  See ya up the road,
                  Gunnar

                  --
                  “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
  2. Hello out there!

    Ich habe in einem Ordner ca. 100 Bilder.

    Wieviele denn nun? Genau 100? Dann ...

    Per Script eine Zufallszahl erzeugen (zwischen 1 und 100)

    (OK, mag der Zufall uns die 100 bescheren.)

    <img src=".../[Zufallszahl].jpg">
    <img src=".../[Zufallszahl + 1].jpg">

    ... hast du hier ein Problem.

    Den Inhalt des Bilder-Ordners per Script sozusagen auslesen lassen und die ausgewählten Bilder dann anzeigen.

    Ja, das sollte auf dem Server so schnell laufen (wesentlich schneller als die Übertragung des Inhalts übers Netz), dass der Nutzer dadurch keine Verzögerung spürt.

    Aber wie möchtest du auswählen? Ein Bild zufällig und dann dessen sechs Nachfolger mit dazunehmen oder wirklich alle sieben zufällig?

    See ya up the road,
    Gunnar

    --
    “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
    1. Tach Gunnar

      Wieviele denn nun? Genau 100?

      OK, sagen wir genau 100 Bilder.

      Dann ...

      Per Script eine Zufallszahl erzeugen (zwischen 1 und 100)
      (OK, mag der Zufall uns die 100 bescheren.)

      <img src=".../[Zufallszahl].jpg">
      <img src=".../[Zufallszahl + 1].jpg">

      ... hast du hier ein Problem.

      Meinst du, weil dann ja ab dem Bild Nr.100 die nachfolgenden (also 101, 102 usw.) garnicht mehr existieren?

      Ja, das sollte auf dem Server so schnell laufen (wesentlich schneller als die Übertragung des Inhalts übers Netz), dass der Nutzer dadurch keine Verzögerung spürt.

      OK, verstehe ich dich also richtig, dass es von der Anzeigegeschwindigkeit egal ist, welche der beiden Strategien ich wähle?

      Aber wie möchtest du auswählen? Ein Bild zufällig und dann dessen sechs Nachfolger mit dazunehmen oder wirklich alle sieben zufällig?

      Schöner wäre natürlich alles sieben zufällig.
      Ich hatte die andere Variante nur überlegt, weil ich dachte, dass das Script dann weniger zu tun hätte und somit vielleicht schneller wäre.

      Gruß
      Ingo

      1. Hallo,

        Schöner wäre natürlich alles sieben zufällig.

        Mach das das

        Gruß,
        Severin

        --
        They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
        -- Benjamin Franklin
      2. Hello out there!

        Meinst du, weil dann ja ab dem Bild Nr.100 die nachfolgenden (also 101, 102 usw.) garnicht mehr existieren?

        Genau das.

        OK, verstehe ich dich also richtig, dass es von der Anzeigegeschwindigkeit egal ist, welche der beiden Strategien ich wähle?

        Ja.

        Aber wie möchtest du auswählen? Ein Bild zufällig und dann dessen sechs Nachfolger mit dazunehmen oder wirklich alle sieben zufällig?

        Schöner wäre natürlich alles sieben zufällig.
        Ich hatte die andere Variante nur überlegt, weil ich dachte, dass das Script dann weniger zu tun hätte und somit vielleicht schneller wäre.

        Über das Einlesen des Verzeichnissen mag sich ja noch lohnen nachzudenken, aber DAS ist nun wirklich ein Bruchteil eines Wimpernschlags.

        See ya up the road,
        Gunnar

        --
        “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
  3. Lieber Ingo,

    mein Vorgehen wäre von der Anzahl der tatsächlich vorhandenen Bilder unabhängig:

    1.) benötigte Variablen: $alleBilder, $anzuzueigendeBilder, $index, $bild, $zufallsZahl

    2.) Verzeichnis auslesen, alle Nicht-Bilddateien aussondern und den Rest der Dateinamen in $alleBilder ablegen.

    3.) Eine Schleife tut das Folgende count($alleBilder) mal. Dabei wird $index von count($alleBilder) auf null gezählt. Sollte $index null sein, ist die Schleife beendet (while($index > 0)):
    {
    3a.) $index verkleinern
    3b.) $zufallsZahl zwischen 0 und count($alleBilder) erzeugen
    3c.) den Dateinamen des anzuzeigenden Bildes in $anzuzeigendeBilder übernehmen:
         $anzuzeigendeBilder[] = $alleBilder[$zufallsZahl]
    3d.) das übernommene Bild aus $alleBilder löschen
    3e.) Array neu sortieren, damit die Indices lückenlos sind. Alternativ kann man bei der Erzeugung der Zufallszahl auch prüfen, ob dieser Index nicht schon gelöscht wurde. Je größer die Anzahl vorhandener Bilder, desto mehr tendiere ich zu letzterem!
    }
    4.) alle in $auszugebendeBilder enthaltenen Bilder im HTML-Dokument verwenden:
        foreach ($alleBilder as $bild) { echo "<img src="$bild" alt="" />"; }

    Noch Fragen?

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. hi,

      2.) Verzeichnis auslesen, alle Nicht-Bilddateien aussondern und den Rest der Dateinamen in $alleBilder ablegen.

      Aufwendig, Plattenzugriffe kosten - auf einer stark frequentierten (Start-)Seite vielleicht nicht unbedingt das beste.

      Die Variante mit den "nummerisch benannten" Bildern könnte da doch die "schonendere" sein - erfordert aber natürlich mehr Konsequenz beim Hochladen von Bildern, achten auf lückenlosen "Index", etc.

      3.) Eine Schleife tut das Folgende count($alleBilder) mal. [...]

      Wenn ich alle Bildnamen in einem Array habe, würde ich dieses einmal shufflen, und dann nur noch per for-Schleife die ersten sieben Elemente daraus betrachten (als <img> ausgeben). Anschließend kann das Array dann gerne entsorgt werden (unset).

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. Hello out there!

        Aufwendig, Plattenzugriffe kosten - auf einer stark frequentierten (Start-)Seite vielleicht nicht unbedingt das beste.

        Hm, wie lange sollte ein Server zum Einlesen der (etwa 100) Dateinamen eines(!) Verzeichnisses brauchen? Kann doch nicht so sehr ins Gewicht fallen, oder?

        Wenn ich alle Bildnamen in einem Array habe, würde ich dieses einmal shufflen,

        Was PHP alles so hergibt ...

        und dann nur noch per for-Schleife die ersten sieben Elemente daraus betrachten

        Das ist natürlich deutlich besser als siebenmal zu ziehen und sich um Duplikate kümmern zu müssen.

        See ya up the road,
        Gunnar

        --
        “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
  4. Hallo

    Ich habe es nun ganz einfach gemacht (für z.B. 14 Bilder):

    <?php
    $zufall = rand(1,7);
    echo "<img ../" . $zufall . ".jpg>";
    echo "<img ../" . ($zufall+1) . ".jpg>";
    echo "<img ../" . ($zufall+2) . ".jpg>";
    echo "<img ../" . ($zufall+3) . ".jpg>";
    echo "<img ../" . ($zufall+4) . ".jpg>";
    echo "<img ../" . ($zufall+5) . ".jpg>";
    echo "<img ../" . ($zufall+6) . ".jpg>";
    ?>

    Das hat zwar den Nebeneffekt, dass ab Bild Nr.7 die nachfolgenden immer die gleichen in der selben Reihenfolge sind, aber damit kann ich leben.
    Zumal das dann später bei 100 Bildern nicht mehr auffallen dürte.

    Was meint Ihr?

    Gruß
    Ingo

    1. Hello out there!

      Ich habe es nun ganz einfach gemacht […]
      Das hat zwar den Nebeneffekt, dass ab Bild Nr.7 die nachfolgenden immer die gleichen in der selben Reihenfolge sind, aber damit kann ich leben.

      Kannst du. Aber solltest du?

      Was meint Ihr?

      Dass du vor der Herausforderung, es richtig[tm] zu machen, nicht zurückschrecken solltest.

      See ya up the road,
      Gunnar

      --
      “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
      1. Tach Gunnar

        Kannst du. Aber solltest du?

        :-)

        Dass du vor der Herausforderung, es richtig[tm] zu machen, nicht zurückschrecken solltest.

        Ok, erstmal werde ich es so lassen.
        Aber später, wenn die wichtigeren sachen fertig sind, werde ich mich noch mal an eine "anständige" Lösung machen.

        Es geht ja im Grunde bei meinem Anliegen nur darum, ein klein wenig "Abwechslung" auf meine Startseite zu bringen, wenn die User des öfteren vorbeischauen. Mehr nicht.

        Gruß aus Münster
        Ingo

        1. Hello out there!

          Wenn du nur ein Bild (damit also ein Set von bestimmtes Set von sieben Bildern) zufällig auswählst, könntest du auch dafür sorgen, dass diese gut zusammenpassen.

          Wenn deine Zufallszahl 3 ist, lässt du 3a.jpg, 3b.jpg, …, 3g.jpg anzeigen.

          See ya up the road,
          Gunnar

          --
          “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
    2. echo $begrüßung;

      Was meint Ihr?

      Und immer wieder, wenn ein neues Bild hinzukommt, muss der Programmtext geändert werden. Außerdem müssen alle Bilder lückenlos nummeriert sein. Dieser Wartungsaufwand wäre mit wahsagas Vorschlag, der auch meiner gewesen wäre, nicht vorhanden: Dateinamen mit glob() in ein Array einlesen, mischen, und die ersten 7 davon ausgeben - 2 Funktionsaufrufe und eine Schleife.

      echo "$verabschiedung $name";