Avatar billede RasmusTheR Seniormester
17. juni 2016 - 18:38 Der er 3 kommentarer og
3 løsninger

Kør tilfældig funktion

Hej. Jeg gerne vil lave et script som tilfældigt kalder en af fem forskellige funktioner, herefter venter scriptet 2 sek, hvorefter den tilfældigt kalder en af de fem function igen, dette skal gentages 25 gange..

Er der en som kan hjælpe med sådan et script?
Avatar billede Slater Ekspert
17. juni 2016 - 19:07 #1
(function() {
  var funcs = [
    function() {
      console.log('Første funktion');
    },
    function() {
      console.log('Anden funktion');
    },
    function() {
      console.log('Tredje funktion');
    },
    function() {
      console.log('Fjerde funktion');
    },
    function() {
      console.log('Femte funktion');
    }
  ];
 
  var counter = 0;
  var randomFunc = function() {
    if (++counter > 25)
        return;
    var rand = Math.floor(Math.random() * 5);
    funcs[rand]();
    setTimeout(randomFunc, 2000);
  };
  randomFunc();
})();
Avatar billede olsensweb.dk Ekspert
17. juni 2016 - 19:22 #2
hvor langt er du kommet ??
hvad code arbejder du ud fra ??
er det plain js eller jquery ??

har du kigger på random ??
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
http://www.w3schools.com/jsref/jsref_random.asp
https://forum.jquery.com/topic/jquery-random-number-function

setTimeout (delay)
http://www.w3schools.com/jsref/met_win_settimeout.asp
http://www.w3schools.com/js/js_timing.asp
https://api.jquery.com/delay/


og så er det vel bare en switch på random nummer hvilke function der skal udføres


noget ala Pseudokode

function myFunction() {
    var x = Math.floor((Math.random() * 5) + 1);
    switch(x){
        case 1: func1(); break;
        case 2: func2(); break;
        case 3: func3(); break;
        case 4: func4(); break;
        default func5(); break;       
    }
}

for(i=0, i<25; i++){
    setTimeout(myFunction, 2000);
}
Avatar billede RasmusTheR Seniormester
18. juni 2016 - 11:28 #3
Jeg havde forsøgt mig med en række if-sætninger, da jeg ikke var bekendt med switch, men det er jeg nu :-)

setTimeout(myFunction, 2000); giver lige nu problemer. Det ser ud til at den kalder funktionen efter to sekunder, men at "for" løkken kører uden forsinkelse, så efter de to sekunder kører alle 25 funktioner på samme tid. Kan man lægge en forsinkelse ind i selve løkken? Jeg har prøvet at lege lidt med .delay i jQuery, men kan ikke få den til at virke i denne sammenhæng.
Avatar billede Slater Ekspert
18. juni 2016 - 11:37 #4
Jeg tror ronols bare glemte at skrive "* i", for det vil løse det.

Hvis du skriver setTimeout(myFunction, 2000 * i)
Avatar billede RasmusTheR Seniormester
18. juni 2016 - 12:11 #5
Yes, så er den i vinkel, mange tak for hjælpen begge to :-)
Avatar billede olsensweb.dk Ekspert
18. juni 2016 - 12:17 #6
ref https://da.wikipedia.org/wiki/Pseudokode
Pseudokode er en uformel teknik til at skitsere opbygningen af et computerprogram, før man koder det. Teknikken sigter på at beskrive en løsning, så den er let at læse for mennesker.


så coden var hverken afprøvet, men bare tænkt som princip, min skitsering er så meget code nær.

>Jeg tror ronols bare glemte at skrive "* i", for det vil løse det.
ja

http://stackoverflow.com/questions/5226285/settimeout-in-for-loop-does-not-print-consecutive-values

der er også nogle syntax fejl, men denne skulle virke

<script type="text/javascript">
    function func1(){console.log("F1");}       
    function func2(){console.log("F2");}
    function func3(){console.log("F3");}
    function func4(){console.log("F4");}
    function func5(){console.log("F5");}
   
    function myFunction() {
        var x = Math.floor((Math.random() * 5) + 1);
        switch(x){
            case 1: func1(); break;
            case 2: func2(); break;
            case 3: func3(); break;
            case 4: func4(); break;
            default: func5(); break;       
        }
    }

    for(i=0; i<25; i++){
        setTimeout(myFunction, 2000 * i);
    }
</script>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester