Zufallszahlen

Generierung von Zufallszahlen einfach erklärt in Form eines Lottozahlengenerators in CMD und VBS

Einleitung

Zufallszahlen - es ist eine philosophische Frage, ob es überhaupt Zufall gibt oder alles Gottes Plan ist oder atheistisch gesehen nicht selbst hinter dem Chaos ein System (auf Naturgesetze basierende Gesetzmäßigkeiten) gibt. Im PC-Bereich und in unser "Matrix" - insofern man glaubt, dass wir in einer solchen Leben - gibt es nicht wirklich Zufallszahlen.

Das nennt sich dann in den meisten Computersprachen "Random" (engl. zufällig) und gibt es als Befehl mit unterschiedlicher Syntax in den Computersprachen. Das ist dann z. B. in der Kommandozeile eine Zahl zwischen 0 - 32768. Die wird dann durch unterschiedliche Verfahren für einen bestimmten Zahlraum passend gemacht. Ob die Pseudozufälligen . Random-Werte, die aufgrund von festen statistischen Werten generiert werden, nicht für Computerexperten nachvollziehbar sind, steht auf einen anderen Blatt geschrieben.

Wollen Sie eine weitgehend wirklich neutrale "echte" Zufallszahl generieren, dann bietet  die Random.org mit  sicherer Internetverbindung  einen Onlinegenerator an. Dieser generiert "Zufallszahlen" aus dem physikalischen Rauschen des Weltraums an. Sorry, aber dass wird ein Cloudcomputer in ein paar hundert Jahren, soweit die Menschheit noch existiert, auch nachstellen können.

Wikipedia sagt (o. a. Link):" Echte Zufallszahlen werden mit Hilfe physikalischer Phänomene erzeugt: Münzwurf, Würfel, Roulette, Rauschen elektronischer Bauelemente, radioaktive Zerfallsprozesse oder quantenphysikalische Effekte. Diese Verfahren nennen sich physikalische Zufallszahlengeneratoren, sind jedoch zeitlich oder technisch recht aufwendig." Lotto hat Wikipedia dabei leider vergessen.

Warum beschäftigt sich der Sternenhimmelstuermer mit Zufallszahlen? Er ist gerade dabei in seinem NoNSA ein kryptologisch schwer knackbares Verfahren zu entwickeln. Die Verschlüsselung soll auf dem "Zufall" basieren. Dabei ist die entscheidende philosophische Frage, ob es Zufall überhaupt gibt, noch nicht gelöst.


Inhaltsangabe
Lottozahlengenerator in VBS
Lottozahlengenerator in Javascript
Lottozahlengenerator in CMD
Lottozahlen anhand des atmosphärischen Rauschens bestimmen (Javascript)



Lottozahlengenerator in VBS

Im Internet gibt es eine Menge Generatoren von Zufallszahlen - die meisten Skripts funktionierten jedoch leider nicht. Deshalb bastelte der Sternenhimmelstuermer aus einem Skriptvorschlag ein Skript, dass sechs Zufallszahlen nacheinander in einer Textbox anzeigt. Nach jedem drücken der O. K.-Taste wird eine neue Zahl angezeigt - sechs Mal. Dann schließt sich die Textbox. Jede Zahl ist einmalig.

Einfach folgenden blauen Code in ein Textdokument kopieren. Umbenennen in beliebigerName.vbs . Denken Sie als Anfänger daran, dass die Dateiendungen beim Umbennen angezeigt werden müssen.

Überschrift :

egal.vbs

dim array(6)
dim lottozahl, zaehler
for zaehler = 0 to 5
randomize
do
lottozahl = Int(rnd()*49)+1
loop until (lottozahl<>array(0) And _
lottozahl<>array(1) And _
lottozahl<>array(2) And _ 
lottozahl<>array(3) And _
lottozahl<>array(4) And _
lottozahl<>array(5))
array(zaehler) = lottozahl
MsgBox lottozahl
next


Kurzerklärung

dim array(6)
dim lottozahl, zaehler


Es werden drei Variablen erstellt. U. a. ein Array mit dem Inhalt von sechs Werten:

for zaehler = 0 to 5
randomize
do
lottozahl = Int(rnd()*49)+1
loop until (lottozahl<>array(0) And _
lottozahl<>array(1) And _
lottozahl<>array(2) And _ 
lottozahl<>array(3) And _
lottozahl<>array(4) And _
lottozahl<>array(5))
array(zaehler) = lottozahl


In dem Array wird eine Lottozahl generiert und Bestandteil des Arrays - das ganze 0-5 mal, weil Javascript und VBS die Eigenschaft haben, bei 0 zu Zählen zu beginnen - dass ist immer wieder irretierend...

Das Ganze wird so lange in eine Schleife geschickt, bis jeder Zahlenwert im Array unterschiedlich ist. Wer das näher umschrieben haben will, der schaue bei Google nach.  Der Sternenhimmelstuermer verlor leider den Link für das  Ursprungsskript und findet es leider trotz intensiver Suche nicht wieder.



Lottozahlengenerator in Javascript

Der Sternenhimmelstuermer fand in einem Beitrag von 2005 bei SelfHtMl im Diskussionsforum einen Code, der einer leichten Anpassung bedarf, die einen Lottogenerator ohne 0 als Zufallszahl bedarf. Die komplette Beschreibung des Codes ist im Bereich der Javascriptabteilung der Sternenhimmelstuermerseite erklärt.

<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 + 48* Math.random() );
    if( !check[random] )
        {
    n.push(random );
    check[random] = true;
    }
}
document.write (n);
    document.write (" | ");</script>
 </head>
 <body>
  </body>
</html>

Für eine Veränderung müssen Sie lediglich die roten Zahlen ändern: Die rote Sechs steht für 6 Zahlen (Javascript fängt bei Null an zu Zählen - deshalb ist die größe kleiner sechs)!
Warum eine 48? Wir erhöhen mit der 1 bei  der 48 die Zufallszahlen um 1. Die Null geht dabei verloren, aber bei 48 findet noch  eine Erhöhung um 1 statt, was ja bekanntlich 49 ist.

Puh, das Zählen in Javascript ist gewöhnungsbedürftig und der Rest wird wie gesagt hier erklärt

Lottozahlengenerator in CMD

Ein Lottozahlengenerator in CMD ist zumindest für den Sternenhimmelstuermer easy -:) Er brauchte nur  drei Zeilen  für den Grundcode zur Auswahl.  Das Problem ist, dass es unterschiedliche Methoden zur  Erzeugung einer  Pseudozufallszahl gibt. Einige  berechnen die Zufallszahl  auch mit der Windowsuhr als konstanten Wert. Die Wahrscheinlichkeit genau dieselbe Milisekunde eines Tages  zu  bekommen  ist weitaus geringer als bei anderen Verfahren.

Es wird wieder ein Textdokument angelegt, der blaue Code kopiert und in das Textdokument eingefügt. Danach wird der Name in beliebigerName.bat umgetauft. Packen Sie das Skript in einen leeren Ordner, damit nicht versehentlich andere Textdokumente im Ordner gelöscht werden. Der Sternenhimmelstuermer ist ein wenig zu faul jedes Hilfsdokument einzeln zu löschen...

Quelltext

set /a x=0
:Schleife
if %x% GEQ 6 goto ende
set /a x=%x%+1
:neueZahl
SET MIN=1
SET MAX=49
SET /a Zufallszahl=MIN+(MAX-MIN+1)*%random%/32768
If exist %Zufallszahl%_*.txt (goto neueZahl) else echo %Zufallszahl% >%Zufallszahl%_%x%.txt
goto :Schleife
:ende
copy *.txt lottozahlen.log

del
*_*.txt

Erklärung

set /a x=0

Wir setzen eine Variable X auf 0. Damit können wir Dank des Parameters /a rechnen. Den dürfen Sie in dieser Konstruktion nicht auf ein einfaches set reduzieren...

:Schleife

Der Doppelpunkt ist die Einleitung für ein beliebiges Wort danach - eben Schleife in diesem Beispiel. Richtig, dann muss irgendwann eigentlich ein goto Befehl kommen, der die CMD wieder zu diesen Punkt zurückschickt.  Die CMD  arbeitet sich Zeile für Zeile durch. Wozu das jetzt gut ist, werden Sie später sehen.

if %x% GEQ 6 goto ende 

Der Befehl heißt übersetzt wenn unsere Variable X (in Batch immer zwei Prozentzeichen %%) gleich (GEQ ist ein Vergleichsparameter bei zwei gleichen Zahlen, einfach mal in der integrierten Windowshilfe der cmd - Aufruf if /? nachstöbern), dann gehe zum Wort Ende. Aha, man kann also mit einem goto Befehl also zum Ende oder zum Anfang einer Batch springen.

In unserem Lottozahlengeneratorspiel wird nach der Ziehung von sechs Zahlen Schluss gemacht, also wenn x GEQ 6 ist. Das ist beim ersten Durchlauf ziemlich egal, da X ja nur 0 ist. Das ändern wir in der nächsten Zeile:

set /a x=%x%+1

Wir addieren eine 1 zum X und 0+1 ist 1 im ersten Durchlauf - ein wenig leichter als die bescheuerte Zählweise in Javascript und VBS...

:neueZahl

Das ist der Sprungpunkt, wenn eine Zahl später doppelt gezogen werden sollte. X wird dann nicht um eine Zahl erhöht, sondern einfach eine neue Zahl gezogen...


SET MIN=1
SET MAX=49
SET /a Zufallszahl=MIN+(MAX-MIN+1)*%random%/32768



Die nächsten drei Zahlen wurden Original von http://www.winfaq.de/faq_html/Content/tip1000/onlinefaq.php?h=tip1489.htm übernommen. Sind nur ein Bruchteil dieser Batch.

Die bilden also zwei Variablen mit Namen Min und Max und setzen damit den Rahmen von 1 bis 49. Na ja, spätestens in der dritten Zeile kommen die auch nicht um ein set /a rum, um die Zufallszahlszahl und deren Berechnung als Zahlen zu deklarieren ( /a).

Der Rest ist Mathe und für uns Laien gilt die Aussage: Schön, dass die Zeile funktioniert -:)

If exist %Zufallszahl%_*.txt (goto neueZahl) else echo %Zufallszahl% >%Zufallszahl%_%x%.txt
 
Die nächste Zeile ist wieder typisch Sternenhimmelstuermer und wird mal für den ersten Durchlauf ohne Variablen erklärt:

Wenn ein Textdokument mit der Überschrift  bestehend aus der generierten Zufallszahl mit Bindestrich, also z. B. 13_1.txt da ist, dann ab zur weiteren Bearbeitung zum Sprungpunkt neueZahl und eine neue Zahl generieren, sonst gebe mir die in den vorherigen Zeilen generierten Zufallszahl zurück (Echo) und Schreibe
> die Zufallszahl  in ein Textdokument namens 13_1.txt.

Natürlich existiert bisher kein Zufallszahl_*.txt. im ersten Durchlauf da. Im zweiten Durchlauf der Schleife könnte es aber ein 13_2.txt geben. Die zwei ist durch den Stern (Wildcard) ebenso abgedeckt wie die 1aus der ersten Ziehung, aber die 13 der ersten Ziehung beißt sich nun mit der 13 der zweiten Ziehung, also dem Teil der für die Prüfung entscheidend ist. Das ist also immer wieder unsere Kontrolldistanz, ob es eine Zufallszahl gibt oder nicht. Gibt es die Zufallszahl, so verhindert der erste Teil des If-Befehls, dass die in unserer improvisierten Ziehung zu doppelten Zahlen führt.

 
goto :Schleife

Das ist eigentlich der wichtige Befehl. Die CMD geht wieder zurück zur :Schleife und nach dem ersten Durchgang war X=1. Da X immer noch nicht 6 ist (
if %x% GEQ 6 goto ende ) geht es dann weiter und X wird auf 2 erhöht set /a x=%x%+1....Ein Textdokument Zufallszahl_2.txt wird mit einer neuen Zufallszahl generiert...
Irgendwann ist dann die sechs für x erreicht und es geht zum Sprungpunkt Ende (if %x% GEQ 6 goto ende)...

:ende


Na ja, eigentlich noch nicht das Ende:

copy *.txt lottozahlen.log

Erstmal werden die Textdokumente zusammengefügt in einem Textdokument mit Namen lottozahlen.log. Da stehen dann die Lottozahlen untereinander unsortiert drinnen. Natürlich könnte man anhand des Titels der Hilfsdateien wie z. B. 13_1.log die Lottozahlen in "Ziehreihenfolge" sortieren.

Einfach eine neue Schleife bilden - nur so als Hinweis für Anfänger. Durch set /a werden auch zwei oder dreistellige Zahlen als Wildcard * interpretiert, wodurch dann z. B. *_%z%.log bei Benutzung der Variable herauskommt was in konkreten Zahlen bei der ersten Ziehung 13_1.log entsprechen sollte...

del *_*.txt

Am Ende noch eine kleine Bereinigung der Hilfsdateien - nehmen Sie den Befehl ruhig mal weg, dann sehen Sie das ein wenig plastischer vor Augen, wie das so ungefähr funktioniert.


Lottozahlen anhand des atmosphärischen Rauschens bestimmen (Javascript)

Das Javascript hierzu kann man sich wieder runterladen unter https://www.random.org/ . Bei denen gibt es dann wie gesagt eine sichere Verbindung, die auf dieser Seite und im vorgegeben Einbettungscode nicht gegeben ist. Der Autor übernimmt keine Haftung für den Code des eingebetteten I-Frames, aber ist sich ziemlich sicher, dass die Quelle vertrauenswürdig ist.







Fazit

Vieles kriegt der Sternenhimmelstuermer mit Batch genausogut wie mit VBS hin. Er bedient sich damit einer Methode, die man wohl objektorientierte Programmierung mit CMD nennen könnte. Es ist kein Zufall, dass der Sternenhimmelstuermer seit den KI-Abhandlungen nahezu jedes Problem mit CMD lösen kann.

Die Textdokumente werden dabei zu Arrays. Egal ob Archivierung von DateienSpeicherfresser finden, Doublefinder, Desktopsuchmaschine .... Sie werden den Sternenhimmelstuermer und seine Abhandlungen bei anständigen und guten Suchmaschinen mit einem Direktverweis an oberen Positionen finden, weil der Stil, den der Sternenhimmelstuermer prägt, ein wenig eigenwillig, aber zu 100 % zielführend ist.

Für das Projekt Babel wird es demnach auch Zufallszahlen von der Batch geben. Später sollen Batchschreiber wie  VBS-Amateure daraus einen Code weiterentwickeln können der sicherer als der veröffentlichte Code sein wird....