Jana: Zufällige Funktion ausführen

Hallo liebes Forum,

ich würde gerne wissen ob es möglich ist bei Aufrufen einer Seite eine von mehreren Funktionen (es geht um Hintergrundfarbanimationen) nur eine auszuführen. Also dass zufällig eine der Funktionen ausgewählt und gestartet wird...

Gibt es dafür in javascript oder jQuery eine einfache Lösung?

Vielen Dank!
Jana

  1. Grüße,

    Gibt es dafür in javascript oder jQuery eine einfache Lösung?

    ja, funktionen dürfen AFAIK arraywerte sein. wie man zufälligen array schlüßel erzeugt muss ich nicht erklären?
    MFG
    bleicher

    --
    __________________________-

    FirefoxMyth
  2. Hallo,

    ich würde gerne wissen ob es möglich ist bei Aufrufen einer Seite eine von mehreren Funktionen (es geht um Hintergrundfarbanimationen) nur eine auszuführen. Also dass zufällig eine der Funktionen ausgewählt und gestartet wird...

    nicht "out of the box", soweit mir bekannt ist. Ich würde *eine* bestimmte Funktion aufrufen, in dieser Funktion eine Zufallszahl ermitteln und abhängig davon in einer switch-Abfrage eine weitere Funktion aufrufen, die dann für den Effekt sorgt.
    Mit einem etwas mehr objektorientierten Ansatz könnte man auch ein Array mit Funktionsreferenzen anlegen und die gewünschte Funktion direkt aus dem Array aufrufen; man eliminiert damit die switch-Anweisung.

    So long,
     Martin

    --
    Schildkröten können mehr über den Weg berichten als Hasen.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hallo martin,

      Mit einem etwas mehr objektorientierten Ansatz könnte man auch ein Array mit Funktionsreferenzen anlegen und die gewünschte Funktion direkt aus dem Array aufrufen; man eliminiert damit die switch-Anweisung.

      das klingt nach der lösung, die ich gesucht habe!
      kannst du mir vielleicht etwas genauer erklären, wie das funktionieren würde? bin neuling. =)

      vielen dank!

      1. Hallo,

        das klingt nach der lösung, die ich gesucht habe!
        kannst du mir vielleicht etwas genauer erklären, wie das funktionieren würde? bin neuling. =)

        function a() { alert("a") } // Zwei (oder mehrere) Funktionen erstellen  
        function b() { alert("b") }  
          
        var functions = [a, b]; // Die Pointer darauf in ein Array reinpacken  
          
        var rand = Math.floor (Math.rand() * functions.length); // Eine Zufallszahl zwischen 0 und der Anzahl der Funktionen und diese abrunden  
          
        functions[rand](); // Die funktion an der stele der Zufallszahl aus dem Array holen und ausführen (dazu sind die letzten Klammern da)
        

        Alles ungetestet aber es sollte dich schon mal auf den richtigen Weg führen.

        Jeena

        1. Grüße,
          warum nicht anonym direkt im array? das müllt glaube ich den scope etwas weniger zu. oder gibt es da andere gründe?
          MFG
          bleicher

          --
          __________________________-

          FirefoxMyth
          1. Hallo bleicher,

            du meinst so?

            ( [ function() { alert("a"); }, function() { alert("b"); } ][Math.floor(Math.random()*2)] )();

            Das ist ein anonymes Array anonymer Funktionen, von denen eine sofort zufallsgesteuert ausgeführt wird.

            Gruß, Jürgen

            1. Hallo,

              ( [ function() { alert("a"); }, function() { alert("b"); } ][Math.floor(Math.random()*2)] )();

              Gutes Beispiel dass das vor allem für Anfänger wie Jana extrem schwer lesbar ist und somit den Lerneffekt minimiert.

              Da unser Slogan "Energie des Verstehens" ist fand ich ein ausführlicheres Beispiel mit Kommentaren was in der jeweiligen Zeile passiert als eher Zielführend :-)

              Jeena

              1. Hallo Jeena,

                meine Zustimmung. Mein Einzeiler war auch eher an Bleicher gerichtet. Ich habe sogar daran gedacht, noch etwas mit ? und : einzubauen :)

                Mein verlinktes Beispiel ist auch etwas übersichtlicher.

                Warten wir jetzt mal, ob sich Jana noch mal meldet.

                Gruß, Jürgen

          2. Hallo,

            warum nicht anonym direkt im array? das müllt glaube ich den scope etwas weniger zu. oder gibt es da andere gründe?

            Mehrere Gründe.

            1. Jana schreibt sie kann noch nicht so gut JavaScript, es ist viel einfacher zu verstehen was da passiert wenn man die funktionen benennt
            2. wahrscheinlich gibt es die Funktionen schon fertig irgendwo geschrieben
            3. wenn die Funktionen ziemlich groß sind dann hilft es der Übersichtlichkeit ihnen Namen zu geben

            Grundsätzlich kann man das einfach als lambdas ins Array werfen, da das aber als Beispiel für einen Neuling funktionieren sollte habe ich mich dagegen entschieden.

            Jeena

        2. Das mit der Übersichtlichkeit macht jedoch tatsächlich Sinn...=)

          Jeenaparadies, weisst du, warum dein code bei mir nicht funktioniert?..

          functionsrand; // Die funktion an der stele der Zufallszahl aus dem Array holen und ausführen (dazu sind die letzten Klammern da)

          müsste die funktion nicht function [rand] (); heissen?

          Wäre dankbar für eine Antwort...
          vielen Dank

          Jana

          1. Hallo,

            Das mit der Übersichtlichkeit macht jedoch tatsächlich Sinn...=)

            ja, find' ich auch. Wenn man genügend tief in der Materie steckt, kommt einem die kompakte Lösung zwar auch irgendwann übersichtlich vor, aber sie ist nicht unbedingt für Einsteiger geeignet.

            functionsrand; // Die funktion an der stele der Zufallszahl aus dem Array holen und ausführen (dazu sind die letzten Klammern da)
            müsste die funktion nicht function [rand] (); heissen?

            Nein. Wenn du diesen Ansatz schon anschauen willst, lass ihn uns Schritt für Schritt aufdröseln.
            Das Gesamt-Konstrukt sah so aus (siehe Posting von Jeena):

            function a() { alert("a") } // Zwei (oder mehrere) Funktionen erstellen

            function b() { alert("b") }

            var functions = [a, b]; // Die Pointer darauf in ein Array reinpacken

            var rand = Math.floor (Math.rand() * functions.length); // Eine Zufallszahl zwischen 0 und der Anzahl der Funktionen und diese abrunden

            functionsrand; // Die funktion an der stele der Zufallszahl aus dem Array holen und ausführen (dazu sind die letzten Klammern da)

              
            Zunächst definiert er seine einzelnen Funktionen, hier mit den exemplarischen Namen a und b. Im zweiten Schritt legt er ein Array an, das die Namen (genauer: die Referenzen) dieser beiden Funktionen enthält, und nennt das Array functions. Beachte das 's' am Ende, das nicht nur den Plural anzeigt, sondern auch dafür sorgt, dass der Name nicht mit dem Schlüsselwort "function" verwechselt werden kann. Es ist nichts weiter als ein frei gewählter Name, er hätte auch "murmeltiere" heißen können.  
            Dann generiert Jeena eine Zufallszahl, und bemisst ihren Wertebereich nach der Anzahl der Elemente im Array functions.  
              
            Und schließlich ruft er eine der Funktionen auf:  
              functions[rand]();  
              
            Diese Anweisung heißt:  
             \* Schau ins Array "functions"  
             \* Hole das Element heraus, das durch "rand" indiziert wird (daher die eckigen Klammern)  
             \* Nimm an, dass dieses Arrayelement eine Funktion ist, und ruf sie auf (daher die runden Klammern am Ende)  
              
            Jetzt klarer geworden?  
              
            So long,  
             Martin  
            
            -- 
            Ich denke, also bin ich hier falsch.  
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            
            1. Jetzt klarer geworden?

              Ja, vielen Dank...jetzt ist alles klar und funktioniert!

      2. Hallo jana,

        hier ein Beispiel. Die Tannenbaumfunktion besteht aus vier Funktionen, die per gewichtetem Zufall ausgewählt werden.

        Gruß, Jürgen

      3. Ihr seid super,
        vielen Dank!

        Jeena Paradies code hat so leider nicht funktioniert, aber Jürgens Lösung klappt...

        Danke an euch!

        1. Hallo jana,

          Jeena Paradies code hat so leider nicht funktioniert,

          ich glaube das liegt am Tippfehler:

          Math.rand -> Math.random

          aber Jürgens Lösung klappt...

          welche? Mein "Einzeiler" oder das Tannenbaumscript?

          Gruß, Jürgen

          1. Hallo,

            ich glaube das liegt am Tippfehler:
            Math.rand -> Math.random

            Ja stimmt, sorry, hab das einfach aus dem Kopf runtergetippt und wohl mit einer anderen Sprache verwechselt.

            Jeena