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>