HandSpin 360

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:

  1. 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.
  2. 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.