Das Zufallsverfahren
Im Gegensatz zu den hochkomplexen aber vollkommen logikbasierten und analysierenden Verhaltensmethoden,
die
die Strategien in Modus 2 und 3 bilden, wird die richtige Hand (also Schere, Stein oder Papier) beim
Modus
1
vollkommen zufällig gewählt.
Ist das jetzt echter Zufall?
Ja ist es, denn es werden keine verbotenen Pseudo-Zufallszahlen verwendet, die auf einem statischen
Algorithmus basieren.
Bei der realRandom()-Funktion, die wir für das HandSpin360-Projekt eigens programmiert haben, wird auf
Basis
des XOR-Zusammenschlusses aus der System-Uptime in Millisekunden und der Button-Druckzeit (ebenfalls in
Millisekunden), die ein physisch
beeinflusster und damit einmaliger und zufälliger Wert ist, ein Zufallswert gebildet.
Wie genau der Code funktioniert, wird im Folgenden nochmal genauer erläutert:
Die Funktion realRandom(int maxValue)
erzeugt eine Zufallszahl zwischen
1 und einem angegebenen Maximalwert.
Dabei wird nicht einfach ein Standard-Zufallsgenerator verwendet, sondern ein echter,
physikalisch beeinflusster Wert zur Erzeugung des Zufalls genutzt.
Das macht die Funktion besonders zuverlässig für Situationen, in denen echter (nicht
deterministischer) Zufall gebraucht wird – wie eben beim HandSpin360.
Warum ist das echter Zufall?
Statt wie bei vielen Pseudo-Zufallsfunktionen mit einem vorhersehbaren Startwert (Seed) zu
arbeiten, nutzt realRandom()
zwei Faktoren, die von der echten
Welt abhängen:
-
Aktuelle Zeit in Millisekunden
unsigned long timeNow = millis();
Dies ist die Zeit, die seit dem Start des Mikrocontrollers vergangen ist. Sie ist ständig im Fluss und praktisch unmöglich exakt vorherzusagen. -
Tastendruckdauer (pressDuration)
unsigned long pressDuration = Druckdauer;
Das ist die Dauer, wie lange ein Benutzer einen Knopf gedrückt hält – ein einmaliger, physikalischer Wert, der von menschlichem Verhalten abhängt.
Wie wird daraus eine Zufallszahl?
Die beiden Werte werden miteinander kombiniert und in mehreren Schritten weiterverarbeitet:
// Zeit und Druckdauer kombinieren:
unsigned long seed = timeNow ^ pressDuration;
// Bits weiter verschieben und mischen:
seed = (seed >> 3) ^ (seed << 5);
// Ergebnis auf gewünschten Bereich skalieren:
int result = (seed % maxValue) + 1;
Durch diese Bit-Operationen entsteht ein Wert, der jedes Mal stark variiert – selbst bei kleinen Änderungen in Zeit oder Druckdauer.
Fazit
Die Funktion realRandom()
erzeugt echte Zufallszahlen, weil
sie sich auf zwei nicht vorhersagbare Eingaben stützt:
- den exakten Zeitpunkt der Abfrage,
- und ein einzigartiges, menschliches Verhalten (Druckdauer des Tasters).
Im Gegensatz zu vielen Software-Zufallsfunktionen, die bei gleichem Startwert immer dieselbe
Zahlenfolge liefern, ist realRandom()
bei jedem Aufruf wirklich
unvorhersehbar – genau das macht echten Zufall aus.