7. Lehre von unterschiedlichen Zufallszahlen
Einleitung
Der Sternenhimmelstuermer fand in einer Diskussion aus dem Jahr 2005 eine
Menthode zur Erstellung von unterschiedlichen Zufallszahlen. Na ja,
eigentlich ging es um die zufällige Verteilung von 16 Zahlen...im Jahr
2013 nimmt der Sternenhimmelstuermer die Diskussion wieder als
Monolog auf.
Mit ein paar kleinen Änderungen wird der Code zu einer Allzweckwaffe -
egal ob zur zufälligen Ziehung von Datenbanksätzen...Dazu gibt es
eine ungefähre Erklärung, wie es der Anfänger
Sternenhimmelstuermer sich selbst erklärt - egal, hauptsache es
funktioniert...
Inhaltsangabe
1. Kleine Demo mit Erklärung
1. Kleine Demo mit Erklärung
Wie immer am Anfang eine Demo - Es werden sechs Zufallszahlen gezogen und
dann nach dem Trennstrich die zweite Zahl seperat aus dem neuen Array
dargestellt.
Das macht es für Sie später einfacher das System zu begreifen...Welche
Zahl das ist ? - das weiß leider nicht einmal der
Sternenhimmelstuermer...
Quellcode der Demo
<html>
<head>
<meta
name="generator" content="HTML Studio">
<title>Zufallszahlen </title>
<script
language="JavaScript">
var n = new
Array();
var check = new Object();
while(n.length < 6)
{
var random
= Math.round(1 + 5* Math.random() );
if( !check[random] )
{
n.push(random );
check[random] = true;
}
}
document.write (n);
document.write (" | ");
document.write (n[1]);
</script>
</head>
<body>
</body>
</html>
Wir fangen bei der Definition eines Arrays und Objektes an. Bei
Javascript müssen die Variablen erstmal definiert werden, also:
var n = new Array();
var check = new Object();
Bis hierhin ist es doch einfach.
Als nächstes wird eine While-Schleife geöffnet. Die wird so lange
durchlaufen, bis unser Array mit sechs Objekten gefüllt wurde, die dann
die Bezeichnungen n[0], n[1], n[2], n[3], n[4], n[5] einnehmen.
Den Inhalt wissen wir freilich noch nicht:
while(n.length < 6)
{
Dann geht es auch schon weiter mit einer Zufallszahl von 1 - 6,
nämlich: var random =
Math.round(1 + 5* Math.random() );
Es geht hier bei 1 los, weil der Sternenhimmelstuermer keine Null bei
den gezogenen Zahlen haben will. Hier wird eine Zahl von 1-6 gezogen.
Wieso denn das? Durch die 1 am Anfang verlieren wir die Null, aber
dadurch wird gleichzeitig bei der fünf eine Zahl addiert, so dass bei
jedem Schleifendurchlauf eine Zahl von 1-6 gezogen wird. Deshalb wurde
die Variable random auch in die Schleife gelegt, damit bei jedem
Durchlauf eine neue Zahl gezogen wird und die alte Variabel
überschrieben werden.
if( !check[random] )
{
n.push(random );
check[random] = true;
}
So, in der ersten Klammer ( !check[random] ) steht erstmal eine
Bedingung, der eine Anweisung folgt (siehe dazu auch diese Seite).
Die Bedingung ist, dass die existierenden Objekte in dem Array unterschiedlich sind.
Beim ersten Durchlauf gibt es kein Objekt, beim zweiten wird es eins
geben. Das wird hier Mal vorgezogen. Z. B. wird beim ersten Durchlauf
eine Drei generiert. Diese Zahl kommt dann im folgenden in das Array.
So, beim nächsten Durchlauf wird wieder durch Zufall eine drei gezogen,
dann ist !check der Stopper, weil bereits ein Objekt mit einer Drei im
Array existiert.
Aber wie kommt denn in unserem Beispiel die drei als Objekt mit der
Nummer n[o] beim ersten Durchlauf ins Array?
{
n.push(random );
Aha, der Push-Befehl füllt unser Array n mit der zuvor geprüften
Zufallszahl, die ein Objekt vom Array ist.
check[random] = true;
}
der eingegebene Wert muss auf true gesetzt werden. Richtig, wir müssen
für
eine true Prüfung die Zahl noch auf true setzen. Ab jetzt existiert
erstmal ein Inhalt (Objekt) mit der Drei im eben konstruierten
Beispiel. Dann geht die Schleife wieder von vorne los, bis eine
unterschiedliche Zufallszahl entsteht, wenn die vorhanden ist gesellt
Sie sich als weiteres Objekt in das Array - nehmen wir mal an, es ist
eine 4. Dann haben wir n[0]=3 und n[1]=4
. Der Sternenhimmelstuermer hätte einen passenderen Namen wie virtual
für das Array gewählt, um zu betonen, dass da im Hintergrund ein neues
Array zusammengesetzt wird...
Wie gesagt, es werden sechs unterschiedliche Zahlen aus dem Raum 1-6
gezogen. Das ist nur für die Demo wichtig, um zu beweisen, dass nie
eine Zahl doppelt gezogen wird und keine Null gezogen wird! Verstanden,
Sie können genauso gut eine Lottoziehung durchführen, wenn Sie aus der
roten folgenden Zahl var
random = Math.round(1 + 5*
Math.random() ); eine 48
machen und while(n.length
< 6) so lassen wie es ist, da beim Lotto 6 Zahlen gezogen werden...
Sie sehen, wenn Sie ein wenig Verständnis entwickeln, sehen Sie in
einem Code die Möglichkeiten...
Der Quellcode wurde noch nicht zu Ende erklärt - es fehlt noch die
Ausgabe oder eben:
document.write (n);
document.write (" | ");
document.write (n[1]);
Das Array n wird in der
ersten Codezeile komplett ausgegeben. In der nächsten Zeile wird nur für einen
Trennungsstrich gesorgt. Alles mit dem Document.write()- Befehl in den
Body des HTML-Dokumentes...
Aber was soll die dritte Zeile?
Das ist nur eine Demonstration. So lange der Browser bzw. die kleine
Funktion werkelt, gibt es ein virtuelles Array n, dessen Zufallszahlen wieder
mit n[0], n[1], n[2], n[3],
n[4], n[5] angesprochen werden können.
Theoretisch wie praktisch hätten wir also auch 100 Zufallszahlen können
und sechs davon sichtbar machen, in dem wir einfach n[50] oder n [irgendwelche andere] von den
100 Zufallszahlen. sichtbar machen.
Das ist natürlich relativ langweilig, aber genauso können Sie die
Zufallszahlen natürlich benutzen, um in derselben Funktion oder in
anderen Funktionen Bilder per Zufall aufzurufen...aus einer Datenbank
in einem mehrdimensionalen Array, wo der Sternenhimmelstuermer dann
eine for i - Schleife anwenden würde, um auf die n-Array zuzugreifen...
So können Sie einfache Diashows oder ? einfach selbst kreieren. In der
nächsten Lektion wird der Sternenhimmelstuermer das auch ein wenig
anspruchsvoller demonstrieren, aber die Lehre von verschiedenen
Zufallszahlen ist eben ein Grundpfeiler für die "gehobene
Programmierung".
Deshalb legt der Sternenhimmelstuermer eine öffentliche Bibliothek
an. Davon profitieren die User...
Ist schon komisch, der Sternenhimmelstuermer erfand für Batches
eine Technik zur Ziehung von Lottozahlen, die in nachträglicher
Betrachtung ziemlich dieser Technik ähnlich ist, so dass der
Sternenhimmelstuermer nach einer Technik suchte, mit der man
Variablen Zufallszahlen nach einer Prüfung zuordnet und dann die
Variablen ausgibt. Dann fand er den Lösungsansatz bei self-html und der
Sternenhimmelstuermer entschloss sich seinen Variablenansatz zu gunsten
des besseren Array-Ansatzes aufzugeben und den Code nur noch an wenigen
Stellen anzupassen.
Bei einem intuitiven Programmierer ist der Weg entscheidend und nicht
die Syntax. Deshalb ist der Sternenhimmelstuermer vielleicht ein
Anfänger in Javascript, aber immer noch dank seines universalen
Verständnisses von Subsprachen trotzdem noch ein einäugiger unter
vielen Blinden...