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 Dateien,
Speicherfresser 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....