Forum: Mikrocontroller und Digitale Elektronik zufallszahl Arduino


von M.K. (Gast)


Lesenswert?

Hallo Leute ;)

Ich habe mal eine kurze Frage zum random() Befehl.
Ich beschreibe zurzeit ein Arduino mega 2560.

Hier mal der Code:

zufallszahl=random(1,6)

Ich rufe diesen Code mehrmals hintereinander auf.
Als ich mir mal die Zahlen anzeigen ließ ist mir aufgefallen das es 
immer die selben sind nach einem REST.^^

Bin nun etwas verwirrt was das mit zufall zu tun hat...
Villeich könnt ihr mir kurz erklähren was ich falsch mache.

Ich brauche nach dem REST unbedingt auch mal andere Kombinationen^^.

Gruß ans gesammte Forum :)

von Max H. (hartl192)


Lesenswert?

M.K. schrieb:
> Als ich mir mal die Zahlen anzeigen ließ ist mir aufgefallen das es
> immer die selben sind nach einem REST.^^
Meinst du RESET?

> Bin nun etwas verwirrt was das mit zufall zu tun hat...
Nichts, das sind nur Pseudozufallszahlen.

> Ich brauche nach dem REST unbedingt auch mal andere Kombinationen^^.
Du brauchst jedes Mal einen neuen Seed (siehe randomSeed(seed)) oder wie 
wär's mit einem echtem random Generator, du nimmst einen Rauschgenerator 
und misst ihn mit dem ADC. Die Messwerte sind dann deine Zufallszahlen.

: Bearbeitet durch User
von M.K. (Gast)


Lesenswert?

Hallo erst mal danke für die schnelle Antwort.

Hört sich Interssant an. Ich gucke mir das mal an.

Sons gibts keine schnelle Software lösung wo die Zahlen wenigstens mal 
anders sind oder ^^

Vielleich was in Abhänigkeit von Zeit oder so.

von da1l6 (Gast)


Lesenswert?

random() hat genau gar nichts mit Zufall zu tun.
random() generiert eine pseudo-Zufällige folge von zahlen. Die sieht zar 
zufällig aus, ist aber komplett deterministisch.
Da der ATMega beim Reset halt alles vergisst fängt auch die Folge wieder 
von vorne an.

Für halbwegs zufällige zahlen, musst du srandom(x) mit einem echt 
zufälligen x füttern.
Wo du das her bekommst ist dein Problem. Das lässt sich eigentlich nur 
mit extra Hardware lösen.

da1l6

von Max H. (hartl192)


Lesenswert?

Ist die Erzeugung der Zufallszahlen von irgendwelchen Benutzereingaben 
abhängig? Wenn ja könntest du beim ersten Mal millis() als Seed 
verwenden.

von Dussel (Gast)


Lesenswert?

Dein Controller führt ein Programm Befehl für Befehl aus und das jedes 
Mal gleich. Da gibt es kein zufälliges Element und damit auch keine 
zufälligen Zahlen.
Um echte Zufallszahlen zu bekommen, muss ein zufälliges Element 
hinzugefügt werden. Das kann, wie oben beschrieben, der ADC sein, oder 
im einfachen Fall die Zeit bis zu einem Tastendruck. Man startet am 
Programmanfang den Timer mit maximaler Frequenz und liest, sobald eine 
Taste gedrückt wurde, das Timerregister aus. Wenn es nicht um 
hochsichere Kryptographie geht, ist das ausreichend zufällig.

von Dominic A. (neo123)


Lesenswert?

Eine Möglichkeit wäre, eine der erzeugten Zufallszahlen ins EEPROM zu 
speichern. Beim nächsten Start liest du diese Zahl aus, benutzt sie als 
Seed, erzeugst eine neue Zahl und speicherst sie wieder ins EEPROM. So 
erhälst du immer eine andere "Zufalls"reihenfolge.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

M.K. schrieb:

> Sons gibts keine schnelle Software lösung wo die Zahlen wenigstens mal
> anders sind oder ^^

Doch. Natürlich.

random ist (wie schon gesagt) ein Pseudozufallszahlen Generator. D.h. im 
wesentlichen nichts anderes als das die Verteilung der generierten 
Zahlen statistisch denen von echten Zufallszahlen genügt.

Aber: da wird nicht gewürfelt, sondern es gibt eine Formel, die aus 
einem internen Wert (dem sog. Seed)
* die jeweils nächste Zahl errechnet
* den Seed auf einen neuen Stand bringt

D.h. der Generator basiert letzten Endes auf dem Seed Wert. Insbesondere 
basiert er auf dem ersten Seed Wert nach einem Reset.
Glücklicherweise kann man dem Generator diesen Seed Wert vorgeben. D.h. 
man ruft am Anfang des Programms einmalid srand() auf und gibt den 
ersten Seed Wert vor.
Damit steht man aber vor dem Problem, dass man bei jedem Reset einen 
neuen unterschiedlichen Seed Wert benötigt.
Eine einfache Lösung dafür ist es zb. sich den letzten benutzten Seed 
Wert im EEPROM zu speichern, bei einem Reset aus dem EEPROM zu holen, 
damit mittels srand() den Seed Wert vorgeben und den um 1 erhöhten Seed 
Wert wieder im EEPROM zu speichern (für den nächsten Reset)

> Vielleich was in Abhänigkeit von Zeit oder so.

Zeit geht auch.
Die Frage ist allerdings: Wo nimmt dein Arduino die aktuelle Zeit her?

von Max H. (hartl192)


Lesenswert?

Max H. schrieb:
> millis() als Seed verwenden.
oder micros()

Dominic A. schrieb:
> erzeugten Zufallszahlen ins EEPROM zu speichern.
Bedenke dabei, dass du nur 100.000 Write/Erase Cycles hast. Wenn du jede 
Sekunde schreibst sind das nur 27.7 Stunden.

von M.K. (Gast)


Lesenswert?

mmh denke dafür fehlen mir die Kenntnisse um den Code zu erzeugen.
Ich werde mich mal im Netz nach CodeBeispielen umsehen. ;)

von Karl H. (kbuchegg)


Lesenswert?

Max H. schrieb:

> Bedenke dabei, dass du nur 100.000 Write/Erase Cycles hast. Wenn du jede
> Sekunde schreibst sind das nur 27.7 Stunden.

Aber nur wenn du 27.7 Stunden lang nichts anderes tust, als den AVR jede 
Sekunde einmal zu resetten :-)

von Max H. (hartl192)


Lesenswert?

Ich wollte es nur sagen, dass niemand auf die Idee kommt jede 
Zufallszahl ins EEPROM zu schreiben.

von Karl H. (kbuchegg)


Lesenswert?

Max H. schrieb:
> Ich wollte es nur sagen, dass niemand auf die Idee kommt jede
> Zufallszahl ins EEPROM zu schreiben.

muss ich dir recht geben.
Was das anbelangt, kommen die Leute auf die seltsamsten Ideen.
Das ist zb oft gar nicht so leicht, den Leuten klar zu machen, dass es 
KEINE gute Idee ist, srand() (oder im Falle des Arduino dann eben 
randomSeed()) mehr als einmal in einem Programmlauf aufzurufen.

von Cyblord -. (cyblord)


Lesenswert?

M.K. schrieb:
> mmh denke dafür fehlen mir die Kenntnisse um den Code zu erzeugen.
> Ich werde mich mal im Netz nach CodeBeispielen umsehen. ;)

Programmieren heißt eigentlich, dass man sich auch ab und an selber Code 
ausdenkt und dass man Probleme selbständig in Programme fassen kann, 
ohne für alles ein Beispiel zu brauchen.

von Frank L. (hermastersvoice)


Lesenswert?

ich erzeuge mir den Seed mit den Millis() oder Micros() und addiere dazu 
den ausgelesenen Wert eines unbeschalteten AD-Wandlers. Das hat mir 
bisher immer für brauchbare Zufallszahlen gereicht.

von c-hater (Gast)


Lesenswert?

M.K. schrieb:

> Bin nun etwas verwirrt was das mit zufall zu tun hat...

Eigentlich garnichts. Random produziert eine bekannte und damit 
vorhersagbare Folge von Zahlen, die allerdings näherungsweise 
gleichverteilt sind.

Was sinnvolles kann man damit nur anfangen, wenn wenigstens der 
Startwert der Folge wirklich zufällig ist.

> Ich brauche nach dem REST unbedingt auch mal andere Kombinationen^^.

Dann füttere den Zufallsgenerator halt mit einem wirklich zufälligen 
Startwert. Es bietet sich an, beim PowerOn-Reset als Zufallsquelle den 
RAM zu nutzen, der zu diesem Zeitpunkt mit einem mehr oder weniger 
zufälligen Bitmuster gefüllt ist.

Das gilt allerdings leider nicht für andere Resets, z.B. per 
Reset-Button oder Watchdog. Das Problem kann man allerdings relativ 
einfach umgehen, indem man aus den erzeugten "Zufallszahlen" jeweils ein 
paar Bits entnimmt, um zufällige Zeitpunkte mit vorhersagbarem 
mittleren Abstand zu generieren, an denen der aktuelle Zufallswert 
jeweils im EEPROM gespeichert wird, um dann nach einem "einfachen" Reset 
wieder eingelesen zu werden und als Startwert für die Fortsetzung der 
Folge zu dienen.

Kryptographischen Ansprüchen genügt dieses Gesamtkonstrukt natürlich in 
keinster Weise, aber dafür, irgendwelche bekloppten Spiele oder 
Effektgeneratoren mit hinreichend Zufall zu befeuern, reicht es völlig 
aus.

[Mod]
das übliche C-Bashing entsorgt

: Bearbeitet durch User
von c.m. (Gast)


Lesenswert?

das wird ein e-würfel?

wenn ja hat das ding ja nicht besonders viel zu tun, also könnte man die 
rand()-funktion im leerlauf ständig aufrufen, und bei knopfdruck die 
letzte zahl ausgeben.
die zeit zwischen den knopfdrücken ist dann sozusagen der seed.

von Karl H. (kbuchegg)


Lesenswert?

c.m. schrieb:
> das wird ein e-würfel?
>
> wenn ja hat das ding ja nicht besonders viel zu tun, also könnte man die
> rand()-funktion im leerlauf ständig aufrufen, und bei knopfdruck die
> letzte zahl ausgeben.

Dazu braucht es noch nicht mal rand().
In dieser Konfiguration reicht es, einfach einen Zähler ständig 
durchzählen zu lassen, während eine Taste gedrückt ist. Das geht so 
schnell, dass es für einen Menschen keine Chance gibt, das in 
irgendeiner Form zu manipulieren.

von c.m. (Gast)


Lesenswert?

auch wieder wahr :)

von c-hater (Gast)


Lesenswert?

> [Mod]
> das übliche C-Bashing entsorgt

Das ist ganz eindeutig ZENSUR. Denn bei dem "entsorgten" Teil handelt 
es sich ganz eindeutig nicht um sog. "C-Bashing", sondern um einen 
ernsthaften Hinweis auf Implementierungsprobleme unter C.

OK, sehr tendenziell formuliert, das gebe ich gerne zu, aber 
nichtsdestotrotz von überaus praktischer Relevanz. Siehe 
Debian-SSL-Desaster.

Wer sowas wegzensiert, ist ein UNWISSENDER VOLLHONK.

von Karl H. (kbuchegg)


Lesenswert?

c-hater schrieb:
>> [Mod]
>> das übliche C-Bashing entsorgt
>
> Das ist ganz eindeutig ZENSUR. Denn bei dem "entsorgten" Teil handelt
> es sich ganz eindeutig nicht um sog. "C-Bashing", sondern um einen
> ernsthaften Hinweis auf Implementierungsprobleme unter C.

Vielleicht überdenkst du mal deine Wortwahl. Wenn jedes 2 Worte 
'verschissen' lautet, dann ist das inakzeptabel.

Und ja. Das wär bei mir zu Hause auch nicht anders. Wenn du dich nicht 
einigermassen vernünftig artikulieren kannst und nur mittels 
Kraftausdrücken provozieren willst, dann schmeiss ich dich raus. Und das 
ist keine Zensur.

> Implementierungsprobleme unter C.
das deine C Kenntnisse sehr limitiert sind, hast du mehr als einmal 
eindrucksvoll unter Beweis gestellt. Sei lieber froh, dass ich den 
Unsinn gelöscht habe.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Karl H. schrieb:

> Vielleicht überdenkst du mal deine Wortwohl. WEnn jedes 2 Worte
> 'verschissen' ist, dann ist das inakzeptabel.

Mag sein, für dich.

> Und das
> ist keine Zensur.

Wenn der Sachverhalt selber dabei mit wegzensiert wird, IST das 
Zensur.

Zum Sachverhalt hast du dich allerdings vorsichtigerweise nicht 
geäußert. Das hätte nämlich bedeutet, daß du mir hättest Recht geben 
müssen.

> das deine C Kenntnisse sehr limitiert sind, hast du mehr als einmal
> eindrucksvoll unter Beweis gestellt. Sei lieber froh, dass ich den
> Unsinn gelöscht habe.

Dann bitte ich dich, der du ja mit einer unendlichen Reife der 
Erkenntnis ausgestattet zu sein scheinst, doch einfach mal 
aufzuschreiben, wie du das Problem in C lösen würdest. Asm ist dir dabei 
natürlich strengstens verboten. Jede Herausstellung der Notwendigkeit 
von Asm ist ja für dich immer nur eins: "C-Bashing".

von Karl H. (kbuchegg)


Lesenswert?

c-hater schrieb:
> Karl H. schrieb:
>
>> Vielleicht überdenkst du mal deine Wortwohl. WEnn jedes 2 Worte
>> 'verschissen' ist, dann ist das inakzeptabel.
>
> Mag sein, für dich.

Nicht nur für mich.
Aus der Zone zu kommen ist kein Freibrief für unzivilisiertes Verhalten

von Danny (Gast)


Lesenswert?

Sorry, falls ich es überlesen habe.
Kam mir aber so vor als vom eigentlichen Thema abgeschweift wurde, 
deshalb habe ich alles nur überflogen.

Zufallszahl mit Arduino geht mit random() , dort benutzt du dann einen 
Analogen Eingang, der NICHT beschaltet ist !
Also auch keinen pullup oder so was.
Dadurch "tickt" der wild rum und liefert wirre Zahlen, genau richtig um 
eine Zufallszahl zu generieren.

von c-hater (Gast)


Lesenswert?

Karl H. schrieb:

> Nicht nur für mich.

Immer noch nichts zur Sache? Es wird langsam peinlich für dich...

Und entlarvt endgültig die Art der von dir ausgeübten Zensur als die 
schlimmste denkbare: Zensur, die nicht nur Meinungen unterdrückt, 
sondern sogar objektive Fakten.

> Aus der Zone zu kommen ist kein Freibrief für unzivilisiertes Verhalten

Aber sicher eine gute Grundlage, um Zensur jederzeit erkennen zu können 
und ultimativ hassen zu lernen...

von Dussel (Gast)


Lesenswert?

c-hater schrieb:
> Es wird langsam peinlich für dich...
Es ist und bleibt peinlich für dich.
Karl-Heinz, geh bitte nicht mehr darauf ein und spare deine Gutmütigkeit 
für jemanden, dem du helfen kannst.

Danny schrieb:
> Dadurch "tickt" der wild rum und liefert wirre Zahlen, genau richtig um
> eine Zufallszahl zu generieren.
Hast du das mal ausprobiert? Nicht definiert heißt nicht automatisch 
ständig ändernd. Es kann auch durch die interne Beschaltung trotzdem 
festgelegt sein. Sicher bin ich mir nicht, deshalb frage ich nach.

von Ulrich F. (Gast)


Lesenswert?

@c-hater

Ich habe deinen gelöschten Beitrag gelesen.
Die erste Hälfte fand ich gut.
Die zweite arg bedenklich.

Im Ernst:
Wie lange dauert die Ausbildung zu einem Programmierer?
3 Jahre?
Arg optimistisch, oder?

Als Hobby betreiben, auch 5, oder so...

Schaut man auf die Frage, sieht man "Arduino" und Unwissenheit wie 
Random funktioniert. Das ist nicht schlimm.
Unwissenheit ist der stete Begleiter/Antrieb beim lernen.
Hier zeigt es, dass der TE noch in den ersten 6 Monaten steckt.
Das wollen wir ihm doch nicht durch schlechte Stimmung verderben....

Die Löschung des Beitrags halte ich in sofern für vertretbar, als dass 
hier verhindert werden muss, dass Threads in Grabenkriegen pervertieren.
Und ja, ich weiß wovon ich rede!
Bin selber Admin in einem Forum mit über 50.000 Usern.

Es ist klasse, wenn du in Assembler dein Heil findest. Etwas weniger 
Militanz. Bitte.

von Malte S. (maltest)


Lesenswert?

Dussel schrieb:
> Hast du das mal ausprobiert? Nicht definiert heißt nicht automatisch
> ständig ändernd. Es kann auch durch die interne Beschaltung trotzdem
> festgelegt sein. Sicher bin ich mir nicht, deshalb frage ich nach.

Geht schon. Habe gute*) Ergebnisse erzielt mit dem Lesen einiger Samples 
vom ADC unter Verwendung von jeweils nur dem LSB.

* gut != kryptographisch sicher

von Karl H. (kbuchegg)


Lesenswert?

Dussel schrieb:

> Hast du das mal ausprobiert?

Ich habs auch noch nie ausprobiert. Allerdings 'empfehlen' die Arduino 
Leute ebenfalls so eine Methode (was aber noch nichts heissen muss).

Wo?

Na in der Doku zu random(), wie alle Arduino Programmierer natürlich 
wissen, weil sie die ja gelesen haben.
https://www.arduino.cc/en/reference/random

von c-hater (Gast)


Lesenswert?

Dussel schrieb:

> Es ist und bleibt peinlich für dich.

Aha, ein C-Fanboi. Auf die habe ich gewartet. Vielleicht zeigst du ja 
die Lösung, wie man die RAM-Redundanz rein in C nutzbar macht...

Nein, war ein Witz. Ist mir klar, daß du einer der letzten wärst, die 
das liefern könnten...

Der Punkt ist: auch die, die sich wirklich mit C auskennen (und dazu 
gehört K.H. meiner Einschätzung nach durchaus), können die Lösung nicht 
liefern und sie wissen selber nur zu gut, warum das nicht möglich ist.

Sie wollen es aber um's Verrecken nicht zugeben, weil es ihre Ideologie 
stört. Und genau das ist, was wiederum mich stört...

Und zwar so sehr, dass ich mich gezwungen sehe, etwas dagegen zu 
unternehmen. OK, ein paar provokative Beiträge in einem unwichtigen 
deutschsprachigen Forum sind keine wirkliche Revolution. Aber es ist 
das, was ich zu leisten vermag. Und das immerhin will ich auch leisten.

von Danny J. (lichtbogen)


Lesenswert?

Also ich habe das mal mit einem kleinen Spiel versucht, SENSO Nachbau 
oder Simon Say wie es auch genannt wird.
Nur random() funktioniert nicht wirklich.
Ein Analogport der nicht beschaltet wird driftet und gibt 
unterschiedliche Werte aus. Kann man ja leicht testen.

Ob das ganze nun wirklich einer Zufallszahl für komplizierte Algorithmen 
zur Verschlüsselung gleich kommt, kann ich nicht garantieren ;-
)
Für mein Attiny 85 mit 4 LED, 4 Tastern und Piepser für eben so ein 
Spiel, war es ok.

von Ulrich F. (Gast)


Lesenswert?

c-hater schrieb:
> Und zwar so sehr, dass ich mich gezwungen sehe, etwas dagegen zu
> unternehmen. OK, ein paar provokative Beiträge in einem unwichtigen
> deutschsprachigen Forum sind keine wirkliche Revolution. Aber es ist
> das, was ich zu leisten vermag. Und das immerhin will ich auch leisten.

Schade....
Wo bleibt da der Spass...

von Dussel (Gast)


Lesenswert?

Ulrich F. schrieb:
>> Und zwar so sehr, dass ich mich gezwungen sehe, etwas dagegen zu
>> unternehmen.
Nachdem ich das Zitat in Ulrichs Beitrag gesehen habe, hat mich doch 
interessiert, was drinstand. :-/
Da fiel mir das Zitat ein: "Was? Einer? Hunderte!"

von chris_ (Gast)


Lesenswert?

Man könnte den Zufallszahlengenerator mit dem untersten Bit des ADC 
beeinflußen. Das unterste Bit könnte relativ zufällig schwanken.

Oder man könnte eine LED als Lichtsensor verwenden und das unterste Bit 
nehmen.

http://www.instructables.com/id/Arduino-Use-LED-as-a-light-sensor/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.