Gymnasium Löbau/Vertiefungsklasse 2013/Projektarbeit: Lotto 6 aus 49
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Javascript</language>
[[Bild:Lotto_Ziehungsgeraet1.jpg|miniatur|hochkant=2|Ziehungsgerät zum Lotto 6 aus 49]]
== Vorüberlegungen ==
In einer beliebigen Anzahl sollen Lottoziehungen 6 aus 49 simuliert werden.<br />
Zunächst ist es kein Problem, Zufallszahlen zwischen 1 und 49 zu bestimmen (s. [[Gymnasium_Löbau/Vertiefungsklasse_2013/Wiederholung:_Datentypen_und_Programmstrukturen#Zufallszahlen|Zufallszahlen in Datentypen und Progammstrukturen]].
Wir sollten aber daran denken, dass diese Zahlen ohne Zurücklegen gezogen werden und damit paarweise verschieden sein müssen.
== Algorithmus ==
Der nachfolgende Algorithmus kann als Orientierung benutzt werden, um ''eine'' korrekte Lottoziehung zu simulieren. Natürlich wollen wir dann Lottoziehungen in einer ''beliebigen Anzahl'' generieren.
* Lege ein leeres Datenfeld für eine Lottoziehung fest.
* Wiederhole den nachfolgenden Algorithmus für 6 Lotto-Zahlen:
** Erzeuge eine Zufallszahl zwischen 1 und 49.
** Prüfe, ob sie bereits Element des aktuellen Datenfeldes ist.
** Trifft dieser Fall zu, wiederhole die Ziehung bei unverändertem Datenfeld.
** Anderenfalls füge die Zufallszahl dem aktuellen Datenfeld hinzu.
'''Hinweis:''' Mit der Eigenschaft
index = myFeld.indexOf(13);
kann ermttelt werden, welchen Feldindex das Element mit dem Wert $13$ besitzt. Sollte es nicht existieren, wird $-1$ zurück gegeben.
== Implementation ==
Zunächst erzeugen wir eine korrekte Lotto-Ziehung:
<code id="5c156c228668d">
function LottoZiehung() {
var ziehung = new Array();
// -- weitere Anweisungen --
return ziehung;
}
</code>
<code id="5c157fc8c4c0b" hidden>
function korrektZiehung(n) {
var korrekt = true, m = 1;
while (korrekt && m < n) {
var feld = LottoZiehung();
for (var i = 1; i < feld.length - 1; i++)
for (var j = i + 1; j < feld.length; j++)
if (feld[i] == feld[j]) korrekt = false;
m++;
}
return (korrekt && feld.length == 6);
}
</code>
<check execute="korrektZiehung(100)">true</check>
<run id="5c156c22866fd">
LottoZiehung();
</run>
Nun können wir eine größere Anzahl korrekter Ziehungen generieren:
<code id="5c1582bfe097a">
function LottoAusgabe(anzahl) {
// -- weitere Anweisungen --
}
</code>
<run id="5c1582bfe0a57">
LottoAusgabe(20);
</run>
== Gleichverteilung ==
Wir wollen uns von einer hinreichenden Güte der Lottozahlen überzeugen.<br />
Dazu zählen wir das Auftreten jeder gezogenen Lottozahl in einem 49-elementigen Datenfeld. Bei einer großen Anzahl von Ziehungen müsste sich eine Gleichverteilung der Lottozahlen ergeben. Diese visualisieren wir in einem Balkendiagramm.
<code id="5c161f4df3d39" hidden>
var rand = 50;
var maxBreite = 400 - 2 * rand;
var maxHoehe = 300 - 2 * rand;
function minMax(feld) {
var ergebnis = new Array(0, 0);
for (var i = 0; i < feld.length; i++) {
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 breite = maxBreite / feld.length;
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 = 0; i < feld.length; i++)
balken(turtle, feld[i] / (max - min) * maxHoehe, breite);
}
</code>
<code id="5c161f4df3dea">
function LottoVerteilung(anzahl) {
var myLottoVerteilung = new Array();
// --weitere Anweisungen--
return myLottoVerteilung;
}
function VerteilungAusgabe(verteilung) {
// --weitere Anweisungen--
}
</code>
<canvas w="400" h="300"></canvas>
<run id="5c161f4df3e97">
var myLottoVerteilung = LottoVerteilung(1000);
VerteilungAusgabe(myLottoVerteilung);
BalkenDiagramm(canvas1, turtle1, myLottoVerteilung);
</run>