Armin: java random string

Hi,

ich will einen random string aus einem pool von strings ausgeben lassen.
Hier ist der code:

function text() {
};

text = new text();
number = 0;

// textArray
text[number++] = "Random text string 1."
text[number++] = "Random text string 2."
text[number++] = "Random text string 3."
text[number++] = "Random text string 4."
text[number++] = "Random text string 5."
// keep adding items here...

increment = Math.floor(Math.random() * number);

document.write(text[increment]);

Ich will nun 5 mal mit einer random Funktion auf die strings zugreifen und jedes mal soll ein anderer von diesen fünf strings angezeigt werden. Bis jetzt ist es ja so das der teststring 3 z.B. fünf mal hintereinander ausgegeben werden könnte.

Kann mir jemand helfen dieses script umzuschreiben??
Schon mal danke!!

Gruß
Armin

  1. Hallo.

    // textArray
    // keep adding items here...

    Sieht nicht so aus, als ob du das Script selber gemacht hättest *g*

    Ich will nun 5 mal mit einer random Funktion auf die strings zugreifen und jedes mal soll ein anderer von diesen fünf strings angezeigt werden. Bis jetzt ist es ja so das der teststring 3 z.B. fünf mal hintereinander ausgegeben werden könnte.
    Kann mir jemand helfen dieses script umzuschreiben??

    Ja. Ich helfe dir.
    Also hier der Quelltext:

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    <html>
    <head>
    <title>Test</title>

    <!-- Hier beginnt das Script: -->

    <script type="text/javascript" language="JavaScript">
    <!--

    var x = new Array("Auswahl 1","Auswahl 2","Auswahl 3","Auswahl 4","Auswahl 5");
                         // Hier drüber sind die Arrays

    var y5 = "0";        // brauchen wir für das Zufalls-Script
    var z5 = "0";        // brauchen wir auch für das Zufalls-Script

    var zaehler = "5";        // die Anzahl der Arrays

    function texter() {           // Funktionsbeginn

    var y5 = Math.round(Math.random()*zaehler);   // hier ist das Zufalls-Script
    z5 = y5 - 1                                   // hier ist das Zufalls-Script
    if(z5 >4) z5 = 4;                             // hier ist das Zufalls-Script
    if(z5 <0) z5 = 0;                             // hier ist das Zufalls-Script

    if (zaehler > 0) {     // wenn noch Arrays übrig sind wird eine alert
    alert(x[z5]);          // mit einem Zufalls-Array ausgegeben
    }
    else if (zaehler < 1) {          // wenn kein Array mehr da ist, wird
    alert("Es steht keine Auswahl mehr zur Verfügung");   // ein anderes ausgegeben
    }

    if (z5 < 1) {    //
    x[0] = x[1];     //
    }                //
    if (z5 < 2) {    //   Also dieser Teil ermöglicht,
    x[1] = x[2];     //   dass wenn ein Array schon ausgewählt wurde,
    }                //   es nicht nochmal erscheinen kann.
    if (z5 < 3) {    //
    x[2] = x[3];     //   Das geschieht dadurch,
    }                //   dass z.B. Array-5 zu Array-4 wird
    if (z5 < 4) {    //   usw.
    x[3] = x[4];     //
    }                //

    zaehler--;    // dann wird die Array-Anzahl runtergesetzt
    x[4] = "0";   // hier wird dem letzten Array der Wert 0 zu gewiesen,
                  // da dieses Array zu Array-4 wird.

    document.forms[0].elements[0].value = x[0] + "\n" + x[1] + "\n" + x[2] + "\n" + x[3] + "\n" + x[4];

    // das hier drüber ist nur nochmal, um zu zeigen, welche Arrays noch da sind.

    }

    //-->
    </script>

    </head>
    <body>

    <input type="button" onClick="texter()" value="ausw&auml;hlen">

    <br />
    <br />
    <br />

    <form>

    <!-- In diesem Array steht dann, welche Arrays noch übrig sind. -->

    <textarea rows="5" cols="10">
    Auswahl 1
    Auswahl 2
    Auswahl 3
    Auswahl 4
    Auswahl 5</textarea>

    </form>

    </body>
    </html>

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Hier endet der Quelltext.

    Schon mal danke!!

    Kein Problem.
    Klappt es denn?

    Wenn du noch Fragen haben solltest, stelle sie.

    Ich hoffe ich konnte helfen, H2O

    --
    Erst selber im </archiv/> suchen: http://suche.de.selfhtml.org/
    Dann gibt es noch http://www.google.de/ und erst dann das Forum fragen.
    ie:% fl:| br:^ va:| ls:# fo:) rl:? n4:| ss:{ de:] js:) ch:? sh:( mo:? zu:|
    Infos: http://emmanuel.dammerer.at/selfcode.html
    1. Erstmal danke für deine schnelle Hilfe!!!
      Die Funktionsweise stimmt schon mal, allerdings kann ich das script so nicht verwenden da ich die Zufallsstrings mit einem shell script weiter verarbeiten will.

      Das script müsste automatisch ablaufen und auf der selben html seite auf der das script steht alle 5 strings in zufälliger reihenfolge ausgeben.

      also z.B.

      Auswahl 4
      Auswahl 5
      Auswahl 3
      Auswahl 1
      Auswahl 2

      Vielleicht könntest du mir ja auch hier etwas helfen?

      Und nochmal danke für deine hilfe.
      Armin

      1. Hallo armin

        Erstmal danke für deine schnelle Hilfe!!!
        Die Funktionsweise stimmt schon mal, allerdings kann ich das script so nicht verwenden da ich die Zufallsstrings mit einem shell script weiter verarbeiten will.

        Das script müsste automatisch ablaufen und auf der selben html seite auf der das script steht alle 5 strings in zufälliger reihenfolge ausgeben.

        also z.B.

        Auswahl 4
        Auswahl 5
        Auswahl 3
        Auswahl 1
        Auswahl 2

        Ihr braucht die funktionen slice und concat des Array objektes:

        var x = new Array("Auswahl 1","Auswahl 2","Auswahl 3","Auswahl 4","Auswahl 5");

        function texter() {
        if(x.length == 0) return ;
        var y = parseInt(Math.random()* (x.length-1));
        var val = x[y];
        x = x.slice(0, y).concat(x.slice(y+1, x.length));
        return val;
        }

        Struppi.

      2. Hallo.

        Vielleicht könntest du mir ja auch hier etwas helfen?

        Ja:

        Du lässt das Script einfach fünfmal durchlaufen:

        Am Ende der Funktion schreibst du das hier:

        if (zaehler > 0) {
        texter();
        }

        Und statt dem alert(x[z5]); schreibst du:
        document.getElementById("idname").innerHTML = x[z5] + "<br>" + document.getElementById("idname").innerHTML

        Und im Dokument gibst du dann nochmal so ein div an.

        OK, es hat sich doch noch viel geändert, also hier nochmal der ganze Quelltext:

        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

        <html>
        <head>
        <title>Test</title>

        <script type="text/javascript" language="JavaScript">
        <!--

        var x = new Array("Auswahl 1","Auswahl 2","Auswahl 3","Auswahl 4","Auswahl 5");

        var y5 = "0";
        var z5 = "0";

        var zaehler = "5";

        function texter() {

        var y5 = Math.round(Math.random()*zaehler);
        z5 = y5 - 1
        if(z5 >4) z5 = 4;
        if(z5 <0) z5 = 0;

        if (zaehler > 0) {
        document.getElementById("schreibender").innerHTML = x[z5] + "<br>" + document.getElementById("schreibender").innerHTML
        }

        if (z5 < 1) {
        x[0] = x[1];
        }
        if (z5 < 2) {
        x[1] = x[2];
        }
        if (z5 < 3) {
        x[2] = x[3];
        }
        if (z5 < 4) {
        x[3] = x[4];
        }

        zaehler--;
        x[4] = "0";

        if (zaehler > 0) {
        texter();
        }

        }

        //-->
        </script>

        </head>
        <body onLoad="texter();">

        <div id="schreibender">&nbsp;</div>

        </body>
        </html>

        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

        Und Ende des Quelltextes.
        Der dürfte allen Anforderungen entsprechen, oder?

        Und nochmal danke für deine hilfe.

        Kein Problem.

        Bei weiteren Fragen: Frage ruhig.

        ch hoffe ich konnte helfen, H2O

        --
        Erst selber im </archiv/> suchen: http://suche.de.selfhtml.org/
        Dann gibt es noch http://www.google.de/ und erst dann das Forum fragen.
        ie:% fl:| br:^ va:| ls:# fo:) rl:? n4:| ss:{ de:] js:) ch:? sh:( mo:? zu:|
        Infos: http://emmanuel.dammerer.at/selfcode.html
        1. Perfect ;)

          Und nochmal DANKE!!!
          Armin

          1. Ist es eigentlich auch möglich die Ausgaben:

            Auswahl 3
            Auswahl 5
            Auswahl 1
            auswahl 4
            Auswahl 2

            In eine txt Datei umzulenken?

            1. Hallo.

              Wie meinst du das?
              Du möchtest eine Textdatei mit diesem Inhalt erstellen, oder wie?

              Bevor ich darüber nachdenke poste mir bitte erst mal ob du das meinst.
              Mir schwebt da eine Idee vor, aber die ist etwas komplizierter *g*

              Schönen Sonntag, H2O

              --
              Erst selber im </archiv/> suchen: http://suche.de.selfhtml.org/
              Dann gibt es noch http://www.google.de/ und erst dann das Forum fragen.
              ie:% fl:| br:^ va:| ls:# fo:) rl:? n4:| ss:{ de:] js:) ch:? sh:( mo:? zu:|
              Infos: http://emmanuel.dammerer.at/selfcode.html
              1. Also ich will eigentlich eine .ram (txt)Datei erzeugen. Diese Playliste soll jedesmal mit mp3 links aus meinem string pool gefüttert werden.

                Ich dachte zuerst an ein shell script, damit kann man ja befehle in dateien umleneken (>), allerdings hab ich probleme gehabt dieses script im cgi-bin verzeichnis meines providers auszuführen.

                1. Hallo.

                  Also ich will eigentlich eine .ram (txt)Datei erzeugen. Diese Playliste soll jedesmal mit mp3 links aus meinem string pool gefüttert werden.

                  Mist. Ich hab's doch nicht hinbekommen.
                  Ich wollte eigentlich das machen:

                  1. ein neues Fenster erzeugen
                  2. in das Fenster einen neuen Quellcode schreiben (alten überschreiben)
                  3. nach einer Sekunde soll sich ein Editor öffen in dem der Quelltext der aktuellen Seite steht
                  4. bevor die eine Sekunde zu Ende ist und sich der Editor öffnet, wird der Quelltext erneut überschrieben und zwar mit dem Zufallswerten
                  5 (nicht geklappt) im Quelltext sollten die Zufalls-Arrays stehen

                  Dann hätte der User nur noch auf abspeichern klicken müssen und schon hätte er das ganze gehabt.

                  Warum es aber nicht klappte:
                  in dem geöffneten Editor stand nicht der Quellcode mit den Arrays sondern der Quellcode der allerersten Seite (die die auch die Arrays herstellt)

                  Und da man mit JS im Editor nichts überschreiben kann ist hier (denke ich mal) Schluss.

                  Ich dachte zuerst an ein shell script, damit kann man ja befehle in dateien umleneken (>), allerdings hab ich probleme gehabt dieses script im cgi-bin verzeichnis meines providers auszuführen.

                  Naja. Tröste dich damit, dass ich's auch nicht hinbekommen habe.

                  Sollte ich es doch noch irgendwie schaffen werde ich es posten, aber ich denke, dem ist nicht so.

                  Schönen Sonntag auch weiterhin, H2O

                  --
                  Erst selber im </archiv/> suchen: http://suche.de.selfhtml.org/
                  Dann gibt es noch http://www.google.de/ und erst dann das Forum fragen.
                  ie:% fl:| br:^ va:| ls:# fo:) rl:? n4:| ss:{ de:] js:) ch:? sh:( mo:? zu:|
                  Infos: http://emmanuel.dammerer.at/selfcode.html
                2. Also ich will eigentlich eine .ram (txt)Datei erzeugen. Diese Playliste soll jedesmal mit mp3 links aus meinem string pool gefüttert werden.

                  Das geht mit JS nicht.

                  Ich dachte zuerst an ein shell script, damit kann man ja befehle in dateien umleneken (>), allerdings hab ich probleme gehabt dieses script im cgi-bin verzeichnis meines providers auszuführen.

                  ein CGI Skript muss einen gültige HTTP Header zurückgeben. Ich bezweifle das das ein Shell Skript tut (natürlich könnte es das).
                  Du musst dir CGI Skript schreiben das dies tut.

                  Struppi.

        2. OK, es hat sich doch noch viel geändert, also hier nochmal der ganze Quelltext:

          Ist aber teilweise umständlich.

          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

          <html>
          <head>
          <title>Test</title>

          <script type="text/javascript" language="JavaScript">
          <!--

          var x = new Array("Auswahl 1","Auswahl 2","Auswahl 3","Auswahl 4","Auswahl 5");

          var y5 = "0";
          var z5 = "0";

          var zaehler = "5";

          Ich frag mich, warum du hier Zahlen als Strings abspeicherst. In JS ist das nicht wirklich schlimm, es macht aber keine Sinn eine zusätzliche unnötige Typkonvertierung zu erzwingen.

          die Länge eines Array kann man auch per JS erfragen:

          var zaehler = x.length;

          Was das Skript felxibler macht.

          if (z5 < 1) {
          x[0] = x[1];
          }
          if (z5 < 2) {
          x[1] = x[2];
          }
          if (z5 < 3) {
          x[2] = x[3];
          }
          if (z5 < 4) {
          x[3] = x[4];
          }

          Nach wie vor ist mir unklar warum so kompliziert und vor allem unflexibel - was macht dein Skript, wenn das Array fünfzig oder noch mehr Einträge hat?), wenn es auch einfach geht [pref:t=84419&m=494952].

          Struppi.

          1. Hallo.

            Nach wie vor ist mir unklar warum so kompliziert und vor allem unflexibel - was macht dein Skript, wenn das Array fünfzig oder noch mehr Einträge hat?), wenn es auch einfach geht [pref:t=84419&m=494952].

            Stimmt, im Nachhinein ist mir auch aufgefallen, dass es etwas kompiziert ist, aber wenn es doch funktioniert und da nur 5 Arrays gebraucht werden :-)

            Schönen Tag noch, H2O

            --
            Erst die FAQ's durchgehen: http://de.selfhtml.org/navigation/faq.htm.
            Dann im im </archiv/> suchen: http://suche.de.selfhtml.org/
            http://www.google.de/ nutzen und erst dann das Forum fragen.
            ie:% fl:| br:^ va:| ls:# fo:) rl:? n4:| ss:{ de:] js:) ch:? sh:( mo:? zu:|
            Infos: http://emmanuel.dammerer.at/selfcode.html
            1. Nach wie vor ist mir unklar warum so kompliziert und vor allem unflexibel - was macht dein Skript, wenn das Array fünfzig oder noch mehr Einträge hat?), wenn es auch einfach geht [pref:t=84419&m=494952].

              Stimmt, im Nachhinein ist mir auch aufgefallen, dass es etwas kompiziert ist, aber wenn es doch funktioniert und da nur 5 Arrays gebraucht werden :-)

              Wo steht das?
              Die Verwendung von "beispiel string 1"... "beispiel String 5" klingt für mich eher so, als ob die Anzahl eben nicht klar ist.

              Ach, und wegen den Zahlen als Strings:

              Probier das mal aus:
              alert('010');
              alert(010);

              Struppi.

            2. gruss H2O,

              ... aber wenn es doch funktioniert und da nur
              5 Arrays gebraucht werden :-)

              na aber, was ist denn das fuer eine einstellung ?-)

              Struppis worte und auch sein beispiel schreien doch
                 geradezu nach einer generellen loesung fuer dieses problem:

              Nach wie vor ist mir unklar warum so kompliziert und vor allem
              unflexibel - was macht dein Skript, wenn das Array fünfzig oder
              noch mehr Einträge hat?), wenn es auch einfach geht [pref:t=84419&m=494952].

              vielleicht helfen ja zwei zusaetzlich gestrickte methoden,
                 die jedes beliebige array durchmischen koennen:

              Array.prototype.shuffle = function() { // durchmischt ein array direkt;
                   var i, newArr = [], thisArr = this;
                   while (thisArr.length > 0) {
                     i = Math.floor(Math.random()*thisArr.length);
                     newArr = newArr.concat(thisArr.slice(i,i+1));
                     thisArr = thisArr.slice(0,i).concat(thisArr.slice(i+1,thisArr.length));
                   }
                   for (i=0; i<newArr.length; i++) {
                     this[i] = newArr[i];
                   }
                 };
                 Array.prototype.getShuffled = function() { // gibt ein neues durchmischtes array zurueck;
                   var i, newArr = [], thisArr = this;
                   while (thisArr.length > 0) {
                     i = Math.floor(Math.random()*thisArr.length);
                     newArr = newArr.concat(thisArr.slice(i,i+1));
                     thisArr = thisArr.slice(0,i).concat(thisArr.slice(i+1,thisArr.length));
                   }
                   return newArr;
                 };

              by(t)e by(t)e - peterS. - pseliger@gmx.net

              --
              sh:| fo:) ch:? rl:| br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)
              1. Hallo.

                na aber, was ist denn das fuer eine einstellung ?-)

                Hast ja Recht *schluchz*

                Struppis worte und auch sein beispiel schreien doch
                   geradezu nach einer generellen loesung fuer dieses problem:
                   vielleicht helfen ja zwei zusaetzlich gestrickte methoden,
                   die jedes beliebige array durchmischen koennen:

                Gut, also ich habe selber noch etwas rumgearbeitet und hier ist noch eine Lösung:

                XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                <html>
                <head>
                <title>Test</title>

                <script type="text/javascript" language="JavaScript">
                <!--

                var x = new Array("Auswahl 1",        // hier können noch
                "Auswahl 2",                          // beliebig viele Arrays ergänz werden
                "Auswahl 3");

                var zufall = "0";

                var zaehler = x.length;

                function texter() {

                zaehler = x.length;

                zufall = Math.round(Math.random()*zaehler);
                zufall = zufall - 1;
                if(zufall >= x.length) zufall = eval(x.length + "-1");
                if(zufall <0) zufall = 0;

                if (zaehler > 0) {
                document.getElementById("schreibender").innerHTML = x[zufall] + "<br>" + document.getElementById("schreibender").innerHTML;
                }

                x[zufall] = x[x.length-1];

                x.pop();

                if (zaehler>0) {
                texter();
                }

                }

                //-->
                </script>

                </head>
                <body onLoad="texter();">

                <div id="schreibender">&nbsp;</div>

                </body>
                </html>

                XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

                Also die Vorteile sind, man muss einfach nur die Arrays angeben und das Script läuft von selbst (keine Angabe der Arrays) und es ist auch egal, wie viele Arrays das Script hat.

                Ganz nebenbei finde ich den Aufbau des Scriptes auch ziemlich simpel, also auch für Anfänger geeignet (ohne while, for-Schleifen, usw.)

                Ich würde mich auf weitere Kommentare zum Script freuen.

                Schönen Tag noch, H2O

                --
                Erst die FAQ's durchgehen: http://de.selfhtml.org/navigation/faq.htm.
                Dann im im </archiv/> suchen: http://suche.de.selfhtml.org/
                http://www.google.de/ nutzen und erst dann das Forum fragen.
                ie:% fl:| br:^ va:| ls:# fo:) rl:? n4:| ss:{ de:] js:) ch:? sh:( mo:? zu:|
                Infos: http://emmanuel.dammerer.at/selfcode.html
                1. Gut, also ich habe selber noch etwas rumgearbeitet und hier ist noch eine Lösung:

                  Das aber jetzt nicht mehr die Problemstellung löst (nur einmal das Array durchlaufen), was ist denn an slice so schwierig?

                  var zufall = "0";

                  Warum ein String?

                  function texter() {

                  zaehler = x.length;

                  zufall = Math.round(Math.random()*zaehler);
                  zufall = zufall - 1;
                  if(zufall >= x.length) zufall = eval(x.length + "-1");
                  if(zufall <0) zufall = 0;

                  Was dieses Konstrukt soll ist mir nicht klar.
                  Math.random ist ein Zahl zwischen 0 und 1 wenn du diese mit den Zähler multiplizierst und abrundest komt eine Zahl zwischen 0 und zahler raus.

                  if (zaehler > 0) {
                  document.getElementById("schreibender").innerHTML = x[zufall] + "<br>" + document.getElementById("schreibender").innerHTML;
                  }

                  x[zufall] = x[x.length-1];

                  x.pop();

                  das sollte gehn.

                  Struppi.

                  1. Hallo.

                    Was dieses Konstrukt soll ist mir nicht klar.
                    Math.random ist ein Zahl zwischen 0 und 1 wenn du diese mit den Zähler multiplizierst und abrundest komt eine Zahl zwischen 0 und zahler raus.

                    OK, stimmt, jetzt im Nachhinein fällt es mir auch auf.
                    Ich wollte sicher gehen, dass es nicht kleiner als 0 oder größer als die Anzahl der Arrays ist, aber OK, kann man auch weglassen *g*.

                    Schönen Abend, H2O

                    --
                    Erst die FAQ's durchgehen: http://de.selfhtml.org/navigation/faq.htm.
                    Dann im im </archiv/> suchen: http://suche.de.selfhtml.org/
                    http://www.google.de/ nutzen und erst dann das Forum fragen.
                    ie:% fl:| br:^ va:| ls:# fo:) rl:? n4:| ss:{ de:] js:) ch:? sh:( mo:? zu:|
                    Infos: http://emmanuel.dammerer.at/selfcode.html