Prinz Martin: Stack Overflow at line XYZ

So ich habe bei Google schon gesucht und weiß auch woran es liegt das ich den Fehler immer bekomme.

Ich habe eine function die sich selbst immer wieder aufruft.
(ein scherzprogramm was ich aus jux schreibe um ne berechnete wahrscheinlichkeit beim würfeln meiner schwester zu beweisen)

Dafür würfelt der, überprüft das ergebnis, setzt wenn es ne große straße (1-5 oder 2-6) ist ne variable hoch und soll dann natürlich nochmal würfeln.

Ich benutze halt momentan ne function die sich selbst wieder aufruft.

Gibt es eine Möglichkeit das zu ändern? oder den Fehler zu vermeiden?

am liebsten hätte ich 6.000.000 Wiederholungen. ich poste auch mal mein script.

<html>

<head>
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Neue Seite 1</title>
</head>

<body>
<script type="text/javascript">
<!--

zaehlen = 0;
ende = 0;

function werfen()
{

wuerfel1 = String(Math.round(((Math.random(1)*5)+1)));
wuerfel2 = String(Math.round(((Math.random(1)*5)+1)));
wuerfel3 = String(Math.round(((Math.random(1)*5)+1)));
wuerfel4 = String(Math.round(((Math.random(1)*5)+1)));
wuerfel5 = String(Math.round(((Math.random(1)*5)+1)));
ergebnis = wuerfel1+wuerfel2+wuerfel3+wuerfel4+wuerfel5;
eins     = ergebnis.search(1);
zwei     = ergebnis.search(2);
drei     = ergebnis.search(3);
vier     = ergebnis.search(4);
fuenf    = ergebnis.search(5);
sechs    = ergebnis.search(6);
strassen = 0;

if(zwei >= 0)
  {
  if(drei >= 0)
    {
    if(vier >= 0)
      {
      if(fuenf >= 0)
        {
        if(eins >= 0)
          {
          ende ++;
          }
          else
          {
          if(sechs >= 0)
            {
            ende ++;
            }
          }
        }
      }
    }
  }

if(zaehlen < 999)
  {
  zaehlen ++;
  werfen();
  }

}

//-->
</SCRIPT>

<form name="Formular" action="">
<input type="button" value="Go"  onclick="zaehlen = 0; werfen();">
<input type="button" value="Ende"  onclick="alert(ende); ende = 0;">
</form>

</body>

</html>

  1. Hi,

    Ich benutze halt momentan ne function die sich selbst wieder aufruft.
    Gibt es eine Möglichkeit das zu ändern?

    ja. Einen separaten Thread kannst Du z.B. über window.setTimeout() erzeugen.

    am liebsten hätte ich 6.000.000 Wiederholungen.

    Das wäre dann eine Schleife.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      Ich benutze halt momentan ne function die sich selbst wieder aufruft.
      Gibt es eine Möglichkeit das zu ändern?

      ja. Einen separaten Thread kannst Du z.B. über window.setTimeout() erzeugen.

      am liebsten hätte ich 6.000.000 Wiederholungen.

      Das wäre dann eine Schleife.

      Cheatah

      wie einen seperaten thread kann ich über winsow.setTimeout() erzeugen? ist das dann so ne zeit in der der aufholen kann oder wie?

      und das mit der schleife hab ich net verstanden, meinst du ich soll das in ne while schleife umbauen? bringt es das denn? weil der holt sich dann doch genau so ein wie wenn ich die function neu aufrufe?!

      1. Hallo

        und das mit der schleife hab ich net verstanden, meinst du ich soll das in ne while schleife umbauen? bringt es das denn? weil der holt sich dann doch genau so ein wie wenn ich die function neu aufrufe?!

        Bei deiner Version wird alles, was die Funktion braucht immer wieder neu zusätzlich auf dem Stack (einem dafür vorgesehen Speicherbereich) abgelegt.
        Weil die Funktion nie beendet wird kann der Stack nie bereinigt werden. Irgendwann ist der dann voll.

        Wenn du eine Schleife verwendest, die diese Funktion aufruft und sie _nachdem_ sie beendet wurde wieder aufruft, wird der Stack jedes Mal wieder bereinigt, er wächst dann nicht ständig weiter.

        Auf Wiederlesen
        Detlef

        --
        - Wissen ist gut
        - Können ist besser
        - aber das Beste und Interessanteste ist der Weg dahin!
        1. also theoretisch

          while(irgendwas)
          {
          function werfen()
          {}
          }

          hängt der sich dann nich in dem while auf?

          1. Hi,

            also theoretisch
            while(irgendwas)
            {
            function werfen()

            Du willst _nicht_ in einer Schleife eine Funktion definieren.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Hi Cheatah!

              Du willst _nicht_ in einer Schleife eine Funktion definieren.

              Geht das in JavaScript denn?

              MfG H☼psel

              --
              "It's amazing I won. I was running against peace, prosperity, and incumbency."
              George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
              Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
              1. Hi,

                Du willst _nicht_ in einer Schleife eine Funktion definieren.
                Geht das in JavaScript denn?

                theoretisch schon. Beim zweiten Durchlauf sollte es aber einen Fehler geben.

                Cheatah

                --
                X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
                1. Hallo Cheatah.

                  Du willst _nicht_ in einer Schleife eine Funktion definieren.
                  Geht das in JavaScript denn?

                  theoretisch schon. Beim zweiten Durchlauf sollte es aber einen Fehler geben.

                  Warum sollte es? Man kann eine Funktion doch schließlich so oft neu deklarieren, wie man möchte.

                  Einen schönen Sonntag noch.

                  Gruß, Ashura

                  --
                  sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                  „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
                  [HTML Design Constraints: Logical Markup]
                  1. Hi,

                    theoretisch schon. Beim zweiten Durchlauf sollte es aber einen Fehler geben.
                    Warum sollte es? Man kann eine Funktion doch schließlich so oft neu deklarieren, wie man möchte.

                    dann verwechsele ich das gerade mit PHP, vermutlich weil ich im Zweifel grundsätzlich auf Existenz der Funktion prüfe.

                    Cheatah

                    --
                    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                    X-Will-Answer-Email: No
                    X-Please-Search-Archive-First: Absolutely Yes
  2. Hi,

    wuerfel1 = String(Math.round(((Math.random(1)*5)+1)));

    Math.random() liefert annähernd gleichmäßig verteilte Zahlen von 0 bis 1.
    (wozu eigentlich der Parameter?)

    Math.random()*5 liefert dann annähernd gleichmäßig verteilte Zahlen von 0 bis 5.

    Math.random()*5 + 1 liefert dann annähernd gleichmäßig verteilte Zahlen von 1 bis 6.

    Math.round(Math.random()*5 + 1) liefert daraus ungleichmäßig verteilte Zahlen von 1 bis 6.

    Die Zahlen aus dem Bereich 1   bis 1.49999... werden zu 1 - der Bereich, aus dem 1 wird, ist also 0.5 lang.
    Die Zahlen aus dem Bereich 1.5 bis 2.49999... werden zu 2 - der Bereich, aus dem 2 wird, ist also 1.0 lang.
    Die Zahlen aus dem Bereich 2.5 bis 3.49999... werden zu 3 - der Bereich, aus dem 3 wird, ist also 1.0 lang.
    Die Zahlen aus dem Bereich 3.5 bis 4.49999... werden zu 4 - der Bereich, aus dem 4 wird, ist also 1.0 lang.
    Die Zahlen aus dem Bereich 4.5 bis 5.49999... werden zu 5 - der Bereich, aus dem 5 wird, ist also 1.0 lang.
    Die Zahlen aus dem Bereich 5.5 bis 6.00       werden zu 6 - der Bereich, aus dem 6 wird, ist also 0.5 lang.

    Was wolltest Du nochmal beweisen? Daß Deine Schwester die Wahrscheinlichkeiten für gezinkte Würfel berechnet hat?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Die Zahlen aus dem Bereich 1   bis 1.49999... werden zu 1 - der Bereich, aus dem 1 wird, ist also 0.5 lang.
      Die Zahlen aus dem Bereich 1.5 bis 2.49999... werden zu 2 - der Bereich, aus dem 2 wird, ist also 1.0 lang.
      Die Zahlen aus dem Bereich 2.5 bis 3.49999... werden zu 3 - der Bereich, aus dem 3 wird, ist also 1.0 lang.
      Die Zahlen aus dem Bereich 3.5 bis 4.49999... werden zu 4 - der Bereich, aus dem 4 wird, ist also 1.0 lang.
      Die Zahlen aus dem Bereich 4.5 bis 5.49999... werden zu 5 - der Bereich, aus dem 5 wird, ist also 1.0 lang.
      Die Zahlen aus dem Bereich 5.5 bis 6.00       werden zu 6 - der Bereich, aus dem 6 wird, ist also 0.5 lang.

      nimm doch eine Zahl im Bereich 1-7,

      =1 und <2 = 1
      =2 und <3 = 2
      =3 und <4 = 3
      =4 und <5 = 4
      =5 und <6 = 5
      =6 und <7 = 6
      =7 wird ignoriert

      so hast du überall die gleiche wahrscheinlichkeit

      lg
      Thomas

  3. Hallo liebe Forumsgemeinde,

    Auch wenn es gegen das Motto von _SELF_HTML ist: Ich presentiere jetzt mal mein Lösung (weil es mich mal gejuckt hat das zu programmieren)

      
    //Wahrscheinlickeit beim Kniffel eine große Straße zu bekommen  
    var strassen = 0;  
    for (var geworfen = 0; geworfen < 6e4; geworfen++) {  
        var array = new Array('1','2','3','4','5','6');  
        for (var i = 0; i < 5; i++) {  
            var wuerfel = Math.ceil(Math.random() * 6);  
            array[wuerfel - 1] = '';  
        }  
        var join = array.join('');  
        if (join == '1' || join == '6') {  
            strassen++;  
        }  
    }  
    var prozent = String(strassen / geworfen * 100).substring(0, 4);  
    alert('Bei ' + geworfen + 'mal Würfeln waren ' + strassen + ' große Straßen dabei! \n Das entspricht ' + prozent + '%!');  
    
    

    Ich hoffe ich konnte helfen!

    Grüße
    Jasmin

    1. Hello out there!

      //Wahrscheinlickeit beim Kniffel eine große Straße zu bekommen
      var strassen = 0;
      for (var geworfen = 0; geworfen < 6e4; geworfen++) {
          var array = new Array('1','2','3','4','5','6');
          for (var i = 0; i < 5; i++) {
              var wuerfel = Math.ceil(Math.random() * 6);
              array[wuerfel - 1] = '';

      Wenn die gezogene Zufallszahl 0 ist, gibt das einen Laufzeitfehler.
      Besser:

        
              var wuerfel = Math.floor(Math.random() * 6);  
              array[wuerfel] = '';  
      
      

      if (join == '1' || join == '6') {
              strassen++;
          }

      Damit zählst du aber kleine (1 2 3 4 5) UND große (2 3 4 5 6) Straßen; nicht nur große, wie es oberdrüber steht:

      //Wahrscheinlickeit beim Kniffel eine große Straße zu bekommen

      See ya up the road,
      Gunnar

      --
      “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
      1. Hallo Gunnar,

        if (join == '1' || join == '6') {
                strassen++;
            }

        Damit zählst du aber kleine (1 2 3 4 5)

        das ist eine große Straße

        UND große (2 3 4 5 6) Straßen;

        das ist ebenfalls eine große Straße

        nicht nur große, wie es oberdrüber steht:

        und somit ist die Prüfung in Ordnung.

        //Wahrscheinlickeit beim Kniffel eine große Straße zu bekommen

        eine kleine Straße besteht aus vier aufeinanderfolgenden Zahlen, der Wert des fünften Würfels ist gleichgültig. Deswegen ist selbstverständlich jede große Straße auch eine kleine Straße ...

        Freundliche Grüße

        Vinzenz

        1. Hello out there!

          eine kleine Straße besteht aus vier aufeinanderfolgenden Zahlen, der Wert des fünften Würfels ist gleichgültig.

          Oh, dann hatte ich die Regeln falsch in Erinnerung oder sie haben sich gegenüber denen von vor 25 Jahren geändert.

          See ya up the road,
          Gunnar

          --
          “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
          1. Hallo Gunnar,

            eine kleine Straße besteht aus vier aufeinanderfolgenden Zahlen, der Wert des fünften Würfels ist gleichgültig.

            das kannte ich auch anders: Genau wie du es andeutest, wurde bei uns immer die Folge von 1 bis 5 als kleine, die von 2 bis 6 als große Straße bezeichnet. Eine Folge von nur vier aufeinanderfolgenden Zahlen war bei uns wertlos.

            Oh, dann hatte ich die Regeln falsch in Erinnerung oder sie haben sich gegenüber denen von vor 25 Jahren geändert.

            Oder irgendjemand (egal ob Vinzenz oder wir beide) hat nach einer der vielen Varianten der Spielregeln gespielt.

            Schönen Abend,
             Martin

            --
            Idealismus wächst mit der Entfernung zum Problem.
            1. Hi,

              das kannte ich auch anders: Genau wie du es andeutest, wurde bei uns immer die Folge von 1 bis 5 als kleine, die von 2 bis 6 als große Straße bezeichnet. Eine Folge von nur vier aufeinanderfolgenden Zahlen war bei uns wertlos.

              Gab es unterschiedliche Punkte für 1 bis 5 und 2 bis 6?

              Wenn ja, wäre das unlogisch, da die Wahrscheinlichkeit, 1 bis 5 zu würfeln, genauso groß ist wie die, 2 bis 6 zu würfeln - zumindest bei ungezinkten Würfeln.
              1 bis 4 + x, 2 bis 5 + x oder 3 bis 6 + x (x = beliebige Zahl auf 5. Würfel) ist dagegen deutlich wahrscheinlicher.

              So wie ich das kenne (große Straße = 1 bis 5 bzw. 2 bis 6, kleine Straße = 1 bis 4, 2 bis 5, 3 bis 6) gibt's für die kleine Straße 30, für die große Straße 40 Punkte.

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              Schreinerei Waechter
              O o ostern ...
              Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
              1. Hello out there!

                Gab es unterschiedliche Punkte für 1 bis 5 und 2 bis 6?

                Ja: 30 bzw. 40.

                Wenn ja, wäre das unlogisch, da die Wahrscheinlichkeit, 1 bis 5 zu würfeln, genauso groß ist wie die, 2 bis 6 zu würfeln

                Wer sagt, dass beim Kniffel alles logisch sei? Ein Dreierpasch 1 1 1 2 3 gibt auch weniger Punkte als einer 6 6 6 5 4, obwohl beides gleich wahrscheinlich ist.

                See ya up the road,
                Gunnar

                --
                “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
          2. Hallo Gunnar,

            eine kleine Straße besteht aus vier aufeinanderfolgenden Zahlen, der Wert des fünften Würfels ist gleichgültig.

            Oh, dann hatte ich die Regeln falsch in Erinnerung

            so wird es sein.

            oder sie haben sich gegenüber denen von vor 25 Jahren geändert.

            Nö, so wie in Wikipedia beschrieben, standen die Regeln schon damals auf dem Block. Ich habe es noch nie (auch nicht bei Yatzee-Blöcken) anders gesehen oder gespielt.

            Freundliche Grüße

            Vinzenz

      2. Hallo liebe Forumsgemeinde,

        var wuerfel = Math.ceil(Math.random() * 6);
                array[wuerfel - 1] = '';

        Wenn die gezogene Zufallszahl 0 ist, gibt das einen Laufzeitfehler.

        Wenn du dann besser schlafen kannst, OK. Aber die Wahrscheinlichkeit sollte doch gering sein.

        Besser:

        var wuerfel = Math.floor(Math.random() * 6);
                array[wuerfel] = '';

          
        Damit bekommst du ja ne 0. Und das ist sehr wahrscheinlich (0..0,499999). Auf den Würfeln mit denen ich immer Kniffel gespielt habe.... :-)  
          
        
        > >     if (join == '1' || join == '6') {  
        > >         strassen++;  
        > >     }  
        >   
        > Damit zählst du aber kleine (1 2 3 4 5) UND große (2 3 4 5 6) Straßen; nicht nur große, wie es oberdrüber steht:  
        
        Also nach den Regeln, nach denen ich Kniffel spiel(t)e, bilden genau diese beiden Varianten große Straßen. Aber scheinbar scheint es dar Unterschiede zu geben.  
          
          
        Grüße  
        Jasmin
        
        1. Hello out there!

          Besser:
                  var wuerfel = Math.floor(Math.random() * 6);
                  array[wuerfel] = '';

          Damit bekommst du ja ne 0.

          Ja, natürlich. Die hattest du mit Math.ceil(Math.random() * 6) - 1 auch bekommen. Ist ja auch der Index; und in array[0] steht was? '1'.

          Der Unterschied ist: Bei meiner Variante
            0 ≤ Math.random() < 1
            0 ≤ Math.random() * 6 < 6
            0 ≤ Math.floor(Math.random() * 6) ≤ 5
          '1' ≤ array[Math.floor(Math.random() * 6)] ≤ '6'

          bei deiner hingegen
            0 ≤ Math.random() < 1
            0 ≤ Math.random() * 6 < 6
            0 ≤ Math.ceil(Math.random() * 6) ≤ 6
           -1 ≤ Math.ceil(Math.random() * 6) - 1 ≤ 5

          Laufzeitfehler bei Zugriff auf array[-1]

          Damit bekommst du ja ne 0. Und das ist sehr wahrscheinlich (0..0,499999).

          Nein, das wäre der Fall bei Math.round. Nicht aber bei Math.floor, was genau wie Math.ceil eine Gleichverteilung ergibt; nur halt keinen (unwahrscheinlichen, aber möglichen) Laufzeitfehler.

          See ya up the road,
          Gunnar

          --
          “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
          1. Hallo liebe Forumsgemeinde,

            Nein, das wäre der Fall bei Math.round. Nicht aber bei Math.floor, was genau wie Math.ceil eine Gleichverteilung ergibt; nur halt keinen (unwahrscheinlichen, aber möglichen) Laufzeitfehler.

            Oh, das muss wohl an der Uhrzeit gestern abend gelegen haben... glatt verlesen! :-)

            Du hast natürlich recht, warum soll man von 1-6 "würfeln" lassen, um nacher wieder eins abzuziehen, kann man auch gleich von 0-5 Zahlen genieren lassen.

            Trotzdem kann, genau wie bei Math.ceil, auch bei Math.floor ein Laufzeitfehler enstehen (nicht vorhandener Index), nämlich genau dann wenn Math.random 1 zurückgibt. Math.random() * 6 ergibt dann 6, abgerundet immer noch 6, und das ist halt kein Index.

            Also hat ceil ein Problem mit 0, floor mit 1. Und was macht man da jetzt?

            Grüße
            Jasmin

            1. Hallo Jasmin,

              Oh, das muss wohl an der Uhrzeit gestern abend gelegen haben... glatt verlesen! :-)

              ;-)

              Trotzdem kann, genau wie bei Math.ceil, auch bei Math.floor ein Laufzeitfehler enstehen (nicht vorhandener Index), nämlich genau dann wenn Math.random 1 zurückgibt.

              Nein, weil Math.random() nie den Wert 1 liefert. Die oft formulierte Beschreibung "zwischen 0 und 1" ist da sehr ungenau. Es gilt grundsätzlich

              0 ≤ Math.random() < 1

              Das heißt, der Wert 0 ist im Wertebereich enthalten und _kann_ auftreten, der Wert 1 nicht.

              Ciao,
               Martin

              --
              F: Was ist wichtiger: Die Sonne oder der Mond?
              A: Der Mond. Denn er scheint nachts. Die Sonne dagegen scheint tagsüber, wenn es sowieso hell ist.
              1. Hallo liebe Forumsgemeinde,

                Nein, weil Math.random() nie den Wert 1 liefert. Die oft formulierte Beschreibung "zwischen 0 und 1" ist da sehr ungenau.

                So ne Schweinerei! ;)
                Das sollte im neuen SELFHTML korrigiert werden.

                0 ≤ Math.random() < 1

                Das heißt, der Wert 0 ist im Wertebereich enthalten und _kann_ auftreten, der Wert 1 nicht.

                Das habe ich nicht gewusset.

                Grüße
                Jasmin

                1. Hallo Jasmin

                  So ne Schweinerei! ;)
                  Das sollte im neuen SELFHTML korrigiert werden.

                  Welche Version verwendest du denn?
                  SELFHTML 8.1.1 random()

                  Auf Wiederlesen
                  Detlef

                  --
                  - Wissen ist gut
                  - Können ist besser
                  - aber das Beste und Interessanteste ist der Weg dahin!
                  1. Hello out there!

                    Welche Version verwendest du denn?
                    SELFHTML 8.1.1 random()

                    Hm, da hatte wohl jemand den Bug in den Versionen ≤ 8.1 gemeldet. [ref:bug;736@title=Ah, ja.] ;-)

                    See ya up the road,
                    Gunnar

                    --
                    “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
            2. Hello out there!

              Trotzdem kann, genau wie bei Math.ceil, auch bei Math.floor ein Laufzeitfehler enstehen (nicht vorhandener Index)

              Nö ...

              nämlich genau dann wenn Math.random 1 zurückgibt.

              ... denn das tut Math.random nicht. [ziegenmelker, Detlef G.]

              See ya up the road,
              Gunnar

              --
              “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)