girlx78: eine Zahl mit einem gesamten Array vergleichen

Ich habe folgendes Problem: eine Reihe von Bildern soll zufällig ausgewählt dargestellt werden. das mache ich mit folgendem Code:
("User" ist dabei ein sozusagen mehrdimensionales Array.)

function zufallsFoto() {
for (var i=0; i<fotoAnz; i++) {
document.write('...');}}

Nun möchte ich aber, dass kein Bild doppelt gewählt wird. Das versuchte ich so:

function zufallsFoto() {
 random=Math.floor(Math.random()*User.length);
 for (var i=0; i<fotoAnz; i++) {
  while (random == index[i-1]) {
     random=...;}
    index[i] = random; //Array zum Merken des Vorgängers
    document.write(...);
   }
}

Jetzt kommen keine zwei Bilder mehr direkt nach- bzw. nebeneinander.
Aber wie bekomme ich es hin, gar keine mehr doppelt zu haben?

Gibt es eine Möglichkeit eine Zahl mit einem gesamten Array zu vergleichen?

  1. Hallo,

    wenn ich dein Problem richtig verstehe, willst Du die Elemente eines Arrays (hier Bildernamen) mischen und bei Zugriff mittels Zufallszahl können Elemente doppelt vorkommen.
    Ich habe das Problem so gelöst: Ich nehme ein 2d-Array: in der einen Spalte sind die zu mischenden Elemente, die zweite fülle ich mit Zufallszahlen. Dann wird das 2d-Array nach der Spalte mit den Zufallszahlen sortiert, wodurch dann die Spalte mit den Elementen zufällig angeordnet ist, eben gemischt. Zu sehen gibt es das hier:
    http://home.vrweb.de/j.berkemeier/Buchstabenmixer.html
    Die Funktion wortmix(wort) mischt die inneren Buchstaben eines Wortes, das als Array übergeben wird. Wenn Du die Zeilen
      W[0][1]=0;
      W[Wort.length-1][1]=1;
    einfach wegläßt, wird das ganze Array gemischt.

    Gruß, Jürgen

    1. Hi Jürgen,

      und was passiert bei deinem Konstrukt, wenn Random Zahlen doppelt vorkommen?

      1. Hallo,

        dann bleibt die Reihenfolge an dieser Stelle eben so wie sie ist. Kommt ja beim Mischen auch schon mal vor. (Mischen, geben und verlieren lassen!)

        Gruß, Jürgen

        1. Soweit ich dein system jetzt verstanden habe, funzt es bei mir aber nicht. Mein Problem ist, dass das User Array (besteht aus 3 Dimensionen) in einer externen Datei liegt. Ich kann also nicht einfach eine 4. Dimension hinzufügen.

          Fällt dir noch eine andere Lösung ein?

          1. Hallo,

            .. das User Array (besteht aus 3 Dimensionen)

            also array[i][j][k] ?

            Wenn Du die Werte nur in beliebiger (zufälliger) Reihenfolge benötigst, kopiere sie doch einfach alle hintereinander in ein 1d-Array.

            Gruß, Jürgen

            1. Wenn Du die Werte nur in beliebiger (zufälliger) Reihenfolge benötigst, kopiere sie doch einfach alle hintereinander in ein 1d-Array.

              Gruß, Jürgen

              Das Array soll auch variable sein. D. h., die Datei kann mal ausgetauscht werden durch eine größere oder kleinere Menge an Usern.

              bei einem 1D-Array wäre eine Funktionsweise dann kaum möglich, ohne die js Datei wieder ändern zu müssen, oder?

              Und wenn ich die Werte sortieren will (für immer wieder eine neue Reihenfolge), kommen die 3 Werte eines Fotos ja ganz durcheinander :-)

              1. Hallo,

                Das Array soll auch variable sein. D. h., die Datei kann mal ausgetauscht werden durch eine größere oder kleinere Menge an Usern.

                das sollte für den Mischalgorithmus kein Problem sein.

                bei einem 1D-Array wäre eine Funktionsweise dann kaum möglich, ohne die js Datei wieder ändern zu müssen, oder?

                Du musst einfach die Funktion mit dem Kopieren und Mischen dazutun.

                Und wenn ich die Werte sortieren will (für immer wieder eine neue Reihenfolge), kommen die 3 Werte eines Fotos ja ganz durcheinander :-)

                Jetzt weiß ich ich mehr weiter. Poste mal mehr Informationen darüber wie Dein Array aussieht, oder einen Link.

                Gruß, Jürgen

                1. Jetzt weiß ich ich mehr weiter. Poste mal mehr Informationen darüber wie Dein Array aussieht, oder einen Link.

                  mein Array sieht in etwa so aus (in einer externen Datei):

                  var User = new Array();

                  User[0] = new Array();
                  User[0]["Foto"] = "http://url";
                  User[0]["uid"] = "216518";
                  User[0]["Text"] = "neely,<br>17 Jahre";

                  User[1] = new Array();
                  User[1]["Foto"] = "http://url";
                  User[1]["uid"] = "206586";
                  User[1]["Text"] = "luxusengel,<br>19 Jahre";

                  User[2] = new Array();
                  User[2]["Foto"] = "http://url";
                  User[2]["uid"] = "339102";
                  User[2]["Text"] = "melle,<br>21 Jahre";

                  1. var User = new Array();

                    User[0] = new Array();

                    Das ist kein Array.

                    User[0]["Foto"] = "http://url";
                    User[0]["uid"] = "216518";
                    User[0]["Text"] = "neely,<br>17 Jahre";

                    sondern ein Objekt. und du kannst wie ich es in meinem anderen Posting beschrieben habe einfach noch ein Eigenschaft hinzufügen.

                    User[0] = new Object();

                    User[0].Foto = "http://url";
                    User[0].uid = "216518";
                    User[0].Text = "neely,<br>17 Jahre";

                    Struppi.

                    1. var User = new Array();

                      User[0] = new Array();

                      Das ist kein Array.

                      Habe ja auch geschrieben:

                      ("User" ist dabei ein sozusagen mehrdimensionales Array.)

                      1. User[0] = new Array();

                        Das ist kein Array.

                        Habe ja auch geschrieben:

                        ("User" ist dabei ein sozusagen mehrdimensionales Array.)

                        User ist ein array von Objekten.

                        Struppi.

                  2. Hallo,

                    ich hab es schon geahnt: das ist kein 3d-Array, sondern ein 2d-Array bzw. ein Array von Arrays (oder von Objekten, wie Struppi schrieb). Mach einfach noch eine Spalte / Eigenschaft "zuf" dazu, füll sie mit Zufallszahlen und sortier dann nach dieser Spalte. Du musst dazu aber "VglFkt" anpassen.

                    Gruß, Jürgen

                    PS: Ein n-dimensionales Array benötigt n Indizes zum Zugriff!
                        Die Länge der Zeilen, Spalten, ... sagt nichts über die Dimension aus.

              2. Hi,

                irgendwie verstehe ich die Problematik nicht.

                • Du hast die Bildnamen irgendwo in einem Array abgelegt.
                • Du hast die Zahl n, die die Gesamtzahl der Bilder wiedergibt.
                • Du hast die Zahl x, die die Anzahl der hieraus darzustellenden Bilder bestimmt.
                • was Du nun benötigst, ist ein weiteres Array mit x Elementen, die Zufallszahlen von 0 bis n-1 enthält.
                  Hierzu kannst Du eine einfache Schleife nehmen, die eine Zufallszahl im Wertebereich n ermittelt und vor der Zuordnung im Array prüft, ob diese bereits vorhanden ist.

                freundliche Grüße
                Ingo

                1. Hallo Ingo,

                  • was Du nun benötigst, ist ein weiteres Array mit x Elementen, die Zufallszahlen von 0 bis n-1 enthält.

                  der Wertebereich der Zufallszahlen spielt keine Rolle, da diese Zahlen nur als Sortierkriterium benötigt werden, nicht als Pointer. Dadurch, dass nach den Zufallszahlen sortiert wird, wird der Rest gemischt.

                  Gruß, Jürgen

                  1. Hi,

                    der Wertebereich der Zufallszahlen spielt keine Rolle, da diese Zahlen nur als Sortierkriterium benötigt werden, nicht als Pointer. Dadurch, dass nach den Zufallszahlen sortiert wird, wird der Rest gemischt.

                    so wie ich das verstanden und die Lösung dazu skizziert habe schon.
                    Konkret: wenn n die Anzahl der zur Verfügung stehenden Bilder ist und hieraus x Bilder selektiert werden sollen.
                    Dann bekomme ich in das Zufallsarray x Werte im vorhandenen Wertebereich n, die als Index für das Bildarray verwendet werden können.

                    freundliche Grüße
                    Ingo

                    1. Hallo Ingo,

                      das Problem, wie ich es verstanden habe, ist, eine Folge von Elementen in zufälliger Reihenfolge darzustellen. Beim Zugriff mittels Zufallszahl werden aber Elemente doppelt gezeigt; N Zufallszahlen decken den Bereich von 0 bis N-1 eben nicht gleichmäßig ab, es sei denn, N ist sehr groß und der Zufallszahlgenerator ist sehr gut.
                      Daher die Idee, auf die Elemente nicht per Zufallszahl zuzugreifen, sondern sie zu mischen und dann der Reihe nach darauf zuzugreifen. Hierdurch ist sichergestellt, dass jedes Element genau einmal vorkommt. Die Zufallszahl wird in meinem Algorithmus nur benötigt, um nach etwas Zufälligem sortieren zu können.

                      Gruß, Jürgen

                      1. Hi,

                        ich habe die Ausgangsfrage gerade nochmal nachgelesen und in der Tat keinen Anhaltspukt dafür gefunden, daß nicht alle Bilder auch verwendet werden sollen. In diesem Fall wäre dann für meinen Lösungsansatz n = x und dementsprechend würde eine Schleife ein Array mit n Elementen mit Zufallszahlen von 0 bis n-1 füllen - eine weitere innere Schleife würde jedoch vorher prüfen, ob die ermittelte Zufallszahl bereits "gezogen" wurde und im negativen Fall den Wert zuweisen bzw. im positiven Fall den Schleifenzähler wieder um 1 verringern um neu zu ziehen.
                        Das dürfte im Endeffekt aber Deinem Mischen entsprechen.

                        freundliche Grüße
                        Ingo

  2. Hi girlx78,

    falls User das Array ist, in dem die Bilder sind, genügt es, wenn dieses nur eindimensional ist.
    Wenn Du nun mit User[random] ein Bild nimmst, kannst Du User[random] mit "False" belegen. In der Schleife musst Du vorher prüfen, ob das Feld mit "false" belegt ist. Und Du benötigst noch einen Zähler, damit Die Schleife weiß, wann alle Bilder genutzt wurden.

    Grüße,
    bluntburn

    --
    jeden Tag 'ne Currywurst...
  3. Nun möchte ich aber, dass kein Bild doppelt gewählt wird. Das versuchte ich so:

    function zufallsFoto() {
    random=Math.floor(Math.random()*User.length);
    for (var i=0; i<fotoAnz; i++) {
      while (random == index[i-1]) {
         random=...;}
        index[i] = random; //Array zum Merken des Vorgängers
        document.write(...);
       }
    }

    wieso gibst du dem Bild - wobei ich nicht sehe, wo da ein Bild ist - einfach einen Flag mit?

    Da deine Informationen nach wie vor sehr dürftig sind ist dir schwer zu helfen, aber ich rate mal.

    Wenn dein Array User heißt, dann mach es einfach so:

    random=Math.floor(Math.random()*User.length);
    for (var i=0; i<fotoAnz; i++) {

    while (User[random].show)
    {
       random=...;
    }
    User[random].show = true;

    Struppi.