Arduino: Zufallsgenerator programmieren?

3 Antworten

Benutze die eingebaute Funktion plus eine wirklich zufällige Komponente. Kommt halt draufan, wann die Zahl genergiert werden soll, dauernd oder nur bei bestimmten Ereignissen. Z.B.:

  • Wenn der Zufallsgenerator immer läuft, kannst durch zeitlich zufälliges Drücken eines angeschlossenen Tasters den aktuellen Wert auslesen. Das ist rein zufällig und wird sehr gut gleichverteilt sein.
  • Zusätzlich kannst du die Zufallszahl noch von der Dauer des Tastendrucks abhängig machen.
  • Auch PeterKremsers Einfluss mit dem offenen Eingang (vielleicht noch mit einer kleinen Antenne dran), der dann einen zufälligen Spannungswert aufgrund der 3phasigen Netzfrequenz beisteuert und mit der Zufallszahl verrechnet werden kann, ist gut. Das wäre sicher gut gleichverteilt, weil die Netzfrequenz erstens nicht konstant ist und zweitens sicher nicht in Phase mit der Taktung des Arduinos.
  • Oder hänge einen Lichtsensor (LDR) an einen Eingang, so dass die Helligkeit im Raum oder sich bewegende Personen den Wert beeinflussen, z.B. noch mit einer mathematischen Funktion, z.B. Generatorwert mal Sinus der Helligkeit, normiert auf den Bereich 0000-9999.

Zufallszahlen kann der Arduino zwar selbst generieren mittels random, allerdings werden sich die Zahlen irgendwann periodisch wiederholen und die Abfolge ist zudem bei jedem Start gleich.

Eine Methode wie man mehr oder weniger guten Zufall generieren kann ist indem man zB jede Sekunde den Wert eines offenen ADC Eingang misst und diesen als Seed für Random verwendet.

Wobei das jetzt auch nicht sehr guten Zufall liefert und er nicht wirklich gleichverteilt sein wird.


ohwehohach  15.01.2018, 15:39

Siehe dazu die von mir verlinkte Seite. Hier steht eindeutig, dass wenn man den nur richtig initialisiert, dass dann eben NICHT bei jedem Start auch dasselbe rauskommt. Übrigens genügt es auch, das einmal zu tun. Es ist ein Irrglaube, dass die Zufälligkeit besser wird, wenn man nur regelmäßig den Zufallszahlengenerator neu initialisiert.

0
PeterKremsner  15.01.2018, 15:49
@ohwehohach

In der von dir verlinkten Seite steht genau das was ich in meiner Antwort geschrieben habe...

Es ist ein Irrglaube, dass die Zufälligkeit besser wird, wenn man nur regelmäßig den Zufallszahlengenerator neu initialisiert.

Das kommt ganz auf den Algorithmus an.

Ein PRNG generiert Zufallszahlen immer in einem periodischen Zyklus, wie lang dieser Zyklus ist hängt vom Algorithmus ab und bestimmt wesentlich die Qualität des PRNG.

Weils Ressourcensparend ist kommen auf µC oftmals Rückgekoppelte Schieberegister zum Einsatz, welche je nachdem wie genaus der Entwickler jetzt genommen hat recht kurze Perioden aufweisen.

Der PRNG in der C Standardlibrary wiederholt sich alle 128 Werte denke ich, was oftmals eine zu kleine Periode ist. Ich konnte da schon in einigen Anwendungen ein eindeutiges Muster erkennen.


Damit dieser PRNG jetzt über längere Zeit vernünftig arbeitet muss man den regelmäßig neu Seeden.

Ist der Algorithmus hingegen zB der MersenneTwister so kann man idR auf eine reinitialisierung verzichten, weil dieser eine extrem hohe Periode aufweist.

0
atoemlein  15.01.2018, 21:27

Oh doch, das wird sehr gut gleichverteilt sein.

Der zufällige Spannungswert am offenen Eingang aufgrund der 3phasigen Netzfrequenz, verrechnet mit der Zahl aus dem Zufallsgenerator wäre sicher sehr gut gleichverteilt. Denn die Netzfrequenz ist erstens nicht konstant ist und zweitens sicher nicht in Phase mit der Taktung des Arduinos.

0
PeterKremsner  15.01.2018, 21:39
@atoemlein

Wie gesagt ich hatte diese Art des Zufallsgenerator bereits laufen und die Werte sind nicht gleichverteilt sondern annähernd Gaußverteilt um den Offset des offenen ADC Eingangs.

Wenn ich die Datei noch finde kann ich dir auch ein Histogramm zeigen.

Ich spreche hier nur von den Ausgangswerten des ADCs, was der PRNG draus macht kommt wie immer auf den Algorithmus drauf an.

Ein guter PRNG sollte selbst aus einem Gaußverteilten Seed mit ReSeeds eine annähernd Gleichverteilten Output erzeugen, ein schlechter PRNG kann dadurch aber durchaus selbst dazu neigen einen nicht mehr gleichverteilten Ausgang zu generieren.

0