Nicole: array_rand durch array_unique ergänzen?

Hallo erst mal ;-)

Ich nutze manchmal die funktion array_rand().
Bisher habe ich immer um sicherzugehen
das ergebniss in einem neuen Array gespeichert,
und zwar als array_unique.
Dieses um sicher zu gehen dass keine doppelten vorhanden sind.
Bei grossen Array ist das aber sehr serverlastig.

Bei einem Test mit 10.000 Einträgen fiel mir
auf dass auch array_rand schon keine doppelten
Einträge ausgibt.

Frage:
Hatte ich Glück(zb. gerade diese Php version..),
oder ist darauf Verlass, dass array_rand() niemals
ein Element doppelt auflistet ?

Anmerkung:
Der Gedanke deshalb, weil ja nur eine Zufallsausgabe erfolgt
und bei normalen Zufallsfunktionen können Werte sich ja auch
durchaus wiederholen.

Gruss Nikki

  1. Moin Moin !

    Gegenfragen:

    Was ist an http://www.php.net/manual/de/function.array-rand.php und den Kommentaren dort so schwer zu verstehen ?

    Was wäre so schlimm daran, auf "Nummer Sicher" zu gehen und das array_rand()-Ergebnis durch array_unique() zu jagen?

    Alexander

    --
    Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
    1. Hallo Alexander,

      Gegenfragen:
      Was ist an http://www.php.net/manual/de/function.array-rand.php und den Kommentaren dort so schwer zu verstehen ?

      Schön, dass du denkst zum Programmieren sollte man
      perfekt English können ;-)
      Was mich betrifft, NEIN

      Gruss Nikki

      1. Hi Nicole,

        Schön, dass du denkst zum Programmieren sollte man
        perfekt English können ;-)

        Ohne Englisch kannst du nicht richtig Programmieren lernen. Das ist eine notwendige Vorraussetzung, wenn du über das Anfängerstadium hinauswillst.

        Technisches Englisch -und nur darum geht es hier- ist nicht so schwer. Perfekt können musst du das dazu nicht und zu Anfang wird eben http://dict.leo.org häufiger mal herhalten müssen.

        Gruss,
          Carsten

        1. Hallo Carsten,
          nach über 3000 Scripts,
          grösstenteils multiuser Anwendungen,
          glaube ich nicht Anfängerin zu sein ;-)

          Aber leider hört der Lernprozess natürlich nie auf,
          doch bisher kam ich ganz gut ohne perfektes English aus.

          Ohne Englisch kannst du nicht richtig Programmieren lernen. Das ist eine notwendige Vorraussetzung, wenn du über das Anfängerstadium hinauswillst.

          Was ich mir leut Alexander anschauen sollte, waren Kommentare.
          Und diese sind sogar häufig in deutsch schwer nachzuvollziehen.

          Das Forum hier ist voll von unverständlichen Kommentaren,
          wenngleich die Mehrheit der Kommentare sehr hilfreich ist, oder ?

          Gruss Nikki

    2. Hallo!

      Was ist an http://www.php.net/manual/de/function.array-rand.php und den Kommentaren dort so schwer zu verstehen ?

      Ich finde da auch keinen Kommentart zu diesem Thema. Mir war das auch mal aufgefallen, aber bin ebenfalls nicht sicher und habe weder bei google noch im Manual was dazu gefunden. Aber da ich noch _nie_ gesehen habe dass sich darin doppelte Einträge befinden gehe ich davon aus dass es unique ist, aber belegen kann ich das nicht.

      | Was wäre so schlimm daran, auf "Nummer Sicher" zu gehen und das array_rand()-Ergebnis durch array_unique() zu jagen?
      Die Frage war ja eben ob dies nötig ist ;-)

      Grüße
      Andreas

      1. Danke Andreas,

        Ich finde da auch keinen Kommentar zu diesem Thema. Mir war das auch mal aufgefallen, aber bin ebenfalls nicht sicher und habe weder bei google noch im Manual was dazu gefunden.

        du sprichst mir aus dem Herzen ;-)

        | Was wäre so schlimm daran, auf "Nummer Sicher" zu gehen und das array_rand()-Ergebnis durch array_unique() zu jagen?
        Die Frage war ja eben ob dies nötig ist ;-)

        Genau, weil das den Server extra belastet,
        aber viele können das nicht nachvollziehen, weil
        sie noch nie mit zig tausenden Einträgen arbeiten mussten  ;-)

        Gruss Nikki

        1. Hi Nicole,

          Genau, weil das den Server extra belastet,
          aber viele können das nicht nachvollziehen, weil
          sie noch nie mit zig tausenden Einträgen arbeiten mussten  ;-)

          Wieviele zufällige Einträge brauchst du denn?
          Wenn du nur eine Handvoll brauchst ist das array_unique() ja relativ billig, weil es nur auf ein paar Elemente arbeiten muss.
          Wenn du fast alle Einträge brauchst wäre shuffle(); eventuell eine Alternative.

          Das mit der Serverlast ist grade bei Scriptsprachen oft schwer einzuschätzen (also welche Lösung wieviel Rechenzeit braucht). Hier könnte das das Einlesen und Erzeugen der zigtausend Einträge schon soviel Zeit brauchen das ein array_unique() mehr oder weniger gar nicht auffällt.

          Die Lösung mit array_unique hat ja auch einen Nachteil: Die Anzahl der Ergebniselemente ist nicht vorhersagbar.

          Gruss,
            Carsten

          1. Hallo Carsten,

            danke für deinen Beitrag, aber...

            Ich möchte doch nur erfahren, ob array_rand()
            unter umständen doppelte ausgibt.

            Aber anscheinden gibt es hier niemanden der es genau weiss,
            nur Vermutungen.

            Shuffle() ??
            Ja das wäre auch gut,
            leider ist der Zufallsgenerator nicht gerade gut bei dieser
            Funktion, und es funktioniert nur bei numerischen arrays.

            Gruss Nikki
            p.s.
            Doch die Serverlast bei array_unique fällt
            leider auf. Ist ja auch klar jeder Neueintrag wird mit Inhalt verglichen auf vorhanden ;-)

            1. Hi Nicole,

              Ich möchte doch nur erfahren, ob array_rand()
              unter umständen doppelte ausgibt.

              Da diese Frage nicht zu beanworten ist versuchte ich auf dein vermutetes Problem einzugehen: die Serverlast.

              Aber anscheinden gibt es hier niemanden der es genau weiss,
              nur Vermutungen.

              Es ist offensichtlich nicht dokumentiert. Möchtest du dich in deinen Scripten auf eine undokumentierte Eigenschaft verlassen?
              Praktisch erzeugt es wohl keine doppelten, denn die wären bei kleinen (Test) Arrays recht wahrscheinlich und würden sofort auffallen.

              Shuffle() ??
              Ja das wäre auch gut,
              leider ist der Zufallsgenerator nicht gerade gut bei dieser
              Funktion, und es funktioniert nur bei numerischen arrays.

              Ersteres erscheint unplausibel - der Zufallsgenerator ist AFAIK immer der gleiche, sonst würde das srand() vorher keinen Sinn ergeben. Das es nur numerische Indices verkraftet würde ich mal als Bug bezeichnen, es steht nirgends und macht auch keinen Sinn :-(.
              Dann also $k=array_keys($dein_Feld); $k=shuffle($k); $k=array_slice($k,0,$anzahl); in $k stehen dann die Schlüssel zu deinem Feld in zufälliger Reihenfolge (also das was $k=array_rand($dein_array,$anzahl); auch liefern würde). Aber ob das schneller ist?

              Doch die Serverlast bei array_unique fällt
              leider auf. Ist ja auch klar jeder Neueintrag wird mit Inhalt verglichen auf vorhanden ;-)

              Wie gesagt, das hängt von der Menge der benötigten Elemente ab, aber die verrätst du uns ja nicht ;-)

              Mit $k=array_flip($k); $k=array_flip($k); kannst du auch doppelte aussortieren, solange im Array nur Integer und Strings stehen - evtl. ist das fixer.

              Gruss,
                Carsten

      2. Moin Moin !

        Hallo!

        Was ist an http://www.php.net/manual/de/function.array-rand.php und den Kommentaren dort so schwer zu verstehen ?
        Ich finde da auch keinen Kommentart zu diesem Thema.

        Kommentar 1:

        zak at php dot net
        01-Sep-2000 06:55

        If you have not yet been able to upgrade to PHP 4, then here is a function that duplicates

        array_rand for PHP3.

        [und eine Menge PHP-Code]

        Kommentar 2:

        ssmith at personalcarehmo dot com
        14-Nov-2000 04:03

        THE PROBLEM WITH fake_array_rand() IS THAT IT PRODUCES RESULTS THAT CONTAIN

        DUPLICATES. WHAT IF YOU WANT TO RANDOMLY GO THRU EACH ELEMENT

        OF THE ARRAY?

        THEN THIS IS WHAT YOU'RE LOOKING FOR.

        [und noch mehr PHP-Code]

        Kommentar 1 liefert eine Funktion, die array_rand() für PHP3 nachbilden soll. Kommentar 2 sagt, daß diese Nachbildung problematisch ist, weil sie doppelte Einträge enthalten kann.

        Daraus kann man mit etwas Nachdenken folgern, daß array_rand() eben keine doppelten Einträge liefert, denn sonst wäre die Nachbildung eben nicht problematisch.

        Alexander

        --
        Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
        1. Warum kompliziert wenns auch einfach geht.
          Danke aber ein eifaches "Ja, array_rand enthält keine
          doppelten Einträge" wäre ausrecheind und netter gewesen.

          Zumindest veruche ich hier immer alles so zu beantworten.

          Daraus kann man mit etwas Nachdenken folgern, daß array_rand() eben keine doppelten Einträge liefert, denn sonst wäre die Nachbildung eben nicht problematisch.

          Was die Lösung betrifft:
          ...wenn ich zu allen Problemen hier im Forum,
          aus den Kommemntaren etwas folgern würde, wäre vieles
          mit Sicherheit falsch, da nicht jede Aussage stimmt.

          Alles was ich wollte ist die Antwort, von jemanden
          der es weiss und nicht folgert
          (dann könnte ich auch aus meinen Tests folgern ),
          ob wirklich keine DOPPELTEN VORKOMMEN KÖNNEN.

          Danke Nikki

        2. Hi!

          Kommentar 1 liefert eine Funktion, die array_rand() für PHP3 nachbilden soll. Kommentar 2 sagt, daß diese Nachbildung problematisch ist, weil sie doppelte Einträge enthalten kann.

          Daraus kann man mit etwas Nachdenken folgern, daß array_rand() eben keine doppelten Einträge liefert, denn sonst wäre die Nachbildung eben nicht problematisch.

          Naja, alles mit php3 überlese ich normalerweise, da es meist nur workarounds sind. Danke für die Aufklärung.

          Grüße
          Andreas