hilfe bei random

hallo,
ich wollte so einen 1,8" screen an meinen arduino machen und darauf dann ein komplett zufällig generiertes bild machen, also aus schwarzen und weissen pixeln.
funktioniert soweit auch ganz gut, aber ich merke dass bei jedem restart die muster komplett identisch sind... gibts auch eine andere methode zufällig zu generieren?

MFG Schulbus

Hast du

verwendet?

Gruß
Peter

Da fehlt das Wissen über die Generierung von "Zufalls"zahlen. Das sind erst mal alles nur vollständig deterministische Pseudo-Zufallszahlen. Du hast nirgends einen wirklichen Zufall drin. Wenn der Zahlengenerator mit dem gleichen Seed initalisiert wird, liefert er auch die exakt gleiche Sequenz. Deshalb heißen die Dinger "pseudo random number generator".
Um wirklich Zufall zu haben muss man irgendwelche Zufälligen physikalischen Ereignisse wie Störungen, Elektronenrauschen oder atomaren Zerfall messen.

Die manchmal vorgestellte Lösung mit analogRead() einen Wert für randomSeed() zu erhalten funktioniert nicht richtig! Das streut bei weitem nicht genug. Der Wert von analogRead() ist nahezu uniform.

Auf dem Arduino gibt es aber eine Lösung. Den Jitter zwischen dem Takt zwischen einem vom Prozessortakt abgleiten Timer und dem mit einem eigenen RC-Oszillator ausgestattem Watchdog Timer.

Hierfür gibt es zwei Libraries:

Hier gibt es noch die gleiche Methodik ohne Library:

Es gibt noch TrueRandom, aber das ist relativ schlecht verteilt und daher nicht zu empfehlen. Ich erwähne es nur weil es bei Google Suchen oft auftaucht:
http://www.endolith.com/wordpress/2013/06/19/truerandom-is-not-truly-random/

Eine einfache Lösung ist auch das hier:

Das ist aus der Entropy Library, aber ein eigenständige Funktion mit der du einen wirklich zufälligen Seed für die Arduino Funktion randomSeed() bekommst. Danach kannst du das normale random() verwenden. Wobei die RNG Algorithmen in den vollständigen Libs vielleicht besser sind.

Der Due hat einen echten Hardware RNG, der dann vielleicht auch kryptographischen Anwendungen genügt.

ah ok, danke für die schnellen antworten. nein ich habs nicht mit randomseed gemacht.

das mit den libraries werde ich gleich mal testen.

noch mal ne frage am rande... wenn ich das programm erst starte durch einen knopf oder so, dann ist es doch sehr unwarscheinlich dass ich nach reset zur selben zeit auf den knopf drücke... oder verstehe ich das falsch?

Das Problem mit randomSeed() ist, dass dann immer noch einen wirklich zufälligen Seed brauchst. Sonst hast du lediglich eine andere Sequenz, aber die ist für jeden Seed-Wert gleich.

Deshalb eben die Version am Ende wo man den WDT einmal verwendet um einen zufälligen Seed zu erhalten. Aber du bist wahrscheinlich mit einer der vollständigen Libraries besser beraten, da du das visuell darstellen willst. Da sieht man wenn es nicht wirklich zufällig verteilt ist und man irgendwo Häufungen hat. Grob würde ich Entropy empfehlen, da da am meisten Wissen drin steckt. Der Macher beschäftigt sich generell mit pRNGs und hat auch welche auf anderen Plattformen implementiert. Außerdem wurde ist aus ausführlich getestet.

EDIT:
Noch eine Sache, die ich vergessen hatte: da der maximale Takt des WDT festgelegt ist und bei jedem WDT Interrupt nur ein Bit generiert wird ist diese Methode sehr langsam: ca. 8 Bytes pro Sekunde

Das wird für dich zu langsam sein wenn du damit einen ganzen Bildschirm füllen musst. Hier bietet es sich dann wirklich an nur eine Zufallszahl für randomSeed() zu erzeugen. Danach machst du random() und kannst schnell Zahlen erzeugen. Aber die Sequenz ist jedesmal anders.

Das Problem mit randomSeed() ist, dass dann immer noch einen wirklich zufälligen Seed brauchst

Wenn du die millis seit reset bei Tasterdruck, (oder die Dauer eines Tasterdrucks) als seed nimmst, wird es dir nicht gelingen, die gleiche Random-Sequenz wie beim vorigen Mal zu erzeugen. Das sollte für deine Anforderung reichen.

michael_x:
Wenn du die millis seit reset bei Tasterdruck, (oder die Dauer eines Tasterdrucks) als seed nimmst, wird es dir nicht gelingen, die gleiche Random-Sequenz wie beim vorigen Mal zu erzeugen. Das sollte für deine Anforderung reichen.

Ja, der Tatsendruckmoment oder die Tastendruckdauer ist ein hinreichend unbestimmte und unvorhersagbare bzw beeinflußbare Zeit, daß man gleich Startwerte haben könnte.

Grüße Uwe