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 Programmstrukturen]]).
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 ermittelt 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="5c167dc9b7a0f">
function LottoZiehung() {
 var myLottoZiehung = new Array();
 // -- weitere Anweisungen --
 return myLottoZiehung;
}
</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>

== Gewinnchancen ==

Welche Gewinnchancen haben wir beim Lotto?<br />
Zu einem eigenen Tipp wollen wir zählen, wie oft eine Zahl, zwei Zahlen, drei Zahlen usw. übereinstimmen. Wir beachten dabei, dass im mathematischen Sinne ein "Sechser" auch ein "Fünfer" ist, da zur Übereinstimmung von sechs Zahlen natürlich erst recht fünf Zahlen richtig sein müssen.

<code id="5c16212b3307d">
var myTipp = new Array(3, 8, 9, 10, 12, 21); 
</code>

<run id="5c16212b33117">
</run>