Stack Overflow at line XYZ
Prinz Martin
- javascript
0 Cheatah4 MudGuard1 Jasmin
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>
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
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?!
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
also theoretisch
while(irgendwas)
{
function werfen()
{}
}
hängt der sich dann nich in dem while auf?
Hi,
also theoretisch
while(irgendwas)
{
function werfen()
Du willst _nicht_ in einer Schleife eine Funktion definieren.
Cheatah
Hi Cheatah!
Du willst _nicht_ in einer Schleife eine Funktion definieren.
Geht das in JavaScript denn?
MfG H☼psel
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Hallo liebe Forumsgemeinde,
Nein, das wäre der Fall bei
Math.round
. Nicht aber beiMath.floor
, was genau wieMath.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
Hallo Jasmin,
Oh, das muss wohl an der Uhrzeit gestern abend gelegen haben... glatt verlesen! :-)
;-)
Trotzdem kann, genau wie bei
Math.ceil
, auch beiMath.floor
ein Laufzeitfehler enstehen (nicht vorhandener Index), nämlich genau dann wennMath.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
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
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
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
Hello out there!
Trotzdem kann, genau wie bei
Math.ceil
, auch beiMath.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