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="5c0d59bead27d">
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 + " am häufigsten vertreten.");
}
</code>

'''Hinweis:''' Mit der Konstruktion
 for (var i in feld) {
  //-- 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>