Gymnasium Löbau/Vertiefungsklasse 2013/Komplexe Übung (II): Würfelexperimente mit mehreren Würfeln
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Javascript</language>
[[Bild:Wuerfel1.jpg|miniatur|Wurf mehrerer Würfel]]
== Aufgabe ==
Nun wollen wir das gleichzeitige Werfen mehrerer Würfel simulieren. Dabei soll uns nur interessieren, ''wie oft'' die Summe aller Augenzahlen auftreten.<br />
Dabei soll die häufigste Augenzahl ermittelt werden.
Um signifikante Aussagen zu erhalten, muss diese Simulation in großer Anzahl wiederholt werden können.
== Lösungsschritte ==
* Organisiere die Zählvariablen in einem eindimensionalen Feld (''Array''), in dem alle Zählvariablen zwischen minimaler und maximaler Augenzahl auf Null gesetzt werden.
* Der Index jeder Zählvariablen entspricht nun genau der Summe aller geworfenen Augenzahlen.
* Wiederhole die Simulation in der gewünschten (großen) Anzahl der Würfe mit der gewünschten Anzahl von Würfeln.
* Suche das Maximum aller Zählvariablen.
* Visualisiere das Feld aller Zählvariablen im Balkendiagramm.
== Struktogramm ==
<blockquote>[[Bild:MehrWuerfel1.gif]]</blockquote>
== Programm ==
<code id="5c0d59bead145" hidden>
var rand = 50;
var maxBreite = 600 - 2 * rand;
var maxHoehe = 400 - 2 * rand;
function minMax(feld) {
var ergebnis = new Array(0, 0);
for (var i in feld) {
if (ergebnis[0] > feld[i]) ergebnis[0] = feld[i];
if (ergebnis[1] < feld[i]) ergebnis[1] = feld[i];
}
return ergebnis;
}
function balken(turtle, hoehe, breite) {
turtle.forward(breite); turtle.left(90);
turtle.forward(hoehe); turtle.left(90);
turtle.forward(breite); turtle.left(90);
turtle.forward(hoehe); turtle.left(90);
turtle.forward(breite);
}
function BalkenDiagramm(canvas, turtle, feld) {
var minIndex = feld.length;
var maxIndex = feld.length;
for (var i in feld)
if (minIndex == maxIndex) minIndex = i;
var breite = maxBreite / (maxIndex - minIndex);
var extremWert = minMax(feld);
var min = extremWert[0];
var max = extremWert[1];
canvas.clear();
turtle.hide();
turtle.move(rand, rand + max /(max - min) * maxHoehe);
turtle.right(90);
for (var i in feld)
balken(turtle, feld[i] / (max - min) * maxHoehe, breite);
}
function wuerfelTest(feld, wAnzahl, vAnzahl) {
var minIndex = feld.length;
var maxIndex = feld.length;
for (var i in feld)
if (minIndex == maxIndex) minIndex = i;
var summe = 0;
for (var i in feld)
summe = summe + feld[i];
return ((maxIndex - minIndex) == (maxIndex - wAnzahl) && summe == vAnzahl);
}
</code>
<code id="5c13d3378b19d">
function mehrWuerfel(WuerfelAnzahl, VersuchsAnzahl) {
var ZaehlFeld = new Array();
for (var j = WuerfelAnzahl; j <= 6 * WuerfelAnzahl; j++)
ZaehlFeld[j] = 0;
// -- weitere Anweisungen --
return ZaehlFeld;
}
function mehrWuerfelAusgabe(ZaehlFeld) {
var max = 0, maxPos = 0;
for (var i in ZaehlFeld) {
// -- weitere Anweisungen --
console.log("Augenzahl " + i + ": " + ZaehlFeld[i]);
}
console.log("Die Augenzahl " + maxPos + " ist mit " + max + " Würfen am häufigsten vertreten.");
}
</code>
'''Hinweis:''' Mit der Konstruktion
for (var i in ZaehlFeld) {
//-- Anweisungsteil --
}
nutzen wir geschickt aus, dass undefinierte Feldelemente im Weiteren nicht berücksichtigt werden.
<check execute="wuerfelTest(mehrWuerfel(2, 100), 2, 100) && wuerfelTest(mehrWuerfel(10, 1000), 10, 1000)">
true
</check>
== Auswertung ==
<canvas w="600" h="400"></canvas>
<run id="5c0d59bead321">
var newWuerfelAnzahl = 2;
var newVersuchsAnzahl = 1000;
var newZaehlFeld = mehrWuerfel(newWuerfelAnzahl, newVersuchsAnzahl);
mehrWuerfelAusgabe(newZaehlFeld);
BalkenDiagramm(canvas1, turtle1, newZaehlFeld);
</run>