Forum: Mikrocontroller und Digitale Elektronik rand() liefert immer gleiche Ergebnisse


von Andi (Gast)


Lesenswert?

Hallo,

ich möchte eine Zufallszahl mit rand() erzeugen, bekommen jedoch nach 
dem Start des Mikrocontrollers immer die gleichen Zahlenfolgen. Woran 
liegt das?

von Teo D. (teoderix)


Lesenswert?


von Einer K. (Gast)


Lesenswert?

Weil rand() Pseudozufälle liefert!

Nutze seed() o.ä.

von Thomas Z. (usbman)


Lesenswert?

Das ist das normale Verhalten von rand() übrigens nicht nur auf 
Microcontrollern. Schau dir Mal srand() und seed an.

Thomas

von Markus M. (adrock)


Lesenswert?

Du musst beim Start den Pseudo-Zufallsgenerator mit der srand() Funktion 
initialisieren ("seeden").

Dafür kann man z.B. die aktuelle Zeit (in Sekunden) nehmen kombiniert 
mit dem internen Temperatursensor (sofern vorhanden) o.ä.

von Martin (Gast)


Lesenswert?

Man sollte nie einen Zufallsgenerator mit der Zeit seeden. Nie :)
Wenn das irgendwas sicherheitskritisches ist, liefert der prng 
vorhersagbaren Zahlenfolgen.

von Andi (Gast)


Lesenswert?

Verstehe ich nicht so ganz. Soll eine Zufallsfunktion nicht 
Zufallszahlen erzeugen? Was bringt mir das, wenn da immer die selben 
Zahlenfolgen bei herauskommen? Ist das dann nicht etwas nutzlos?

von Georg A. (georga)


Lesenswert?

Deswegen heisst es Pseudo Zufall. Dahinter steht eine deterministische 
Berechnungsformel, die zwar scheinbar zufällige Werte liefert, aber mit 
identischer Initialisierung des Startwerts immer dieselbe Folge.

von Einer K. (Gast)


Lesenswert?

Andi schrieb:
> Verstehe ich nicht so ganz. Soll eine Zufallsfunktion nicht
> Zufallszahlen erzeugen? Was bringt mir das, wenn da immer die selben
> Zahlenfolgen bei herauskommen? Ist das dann nicht etwas nutzlos?

"Echte" Zufälle sind mit einen µC kaum zu erzeugen!

Versuch das mal, und du wirst sehen....

von Joachim B. (jar)


Lesenswert?

Arduino Fanboy D. schrieb:
> "Echte" Zufälle sind mit einen µC kaum zu erzeugen!

doch am ADC mit offener langer Leitung.

Was die Antenne einfängt muss zufällig sein (glaube ich zumindest)

von Sebastian R. (sebastian_r569)


Lesenswert?

Andi schrieb:
> Verstehe ich nicht so ganz. Soll eine Zufallsfunktion nicht
> Zufallszahlen erzeugen?

Ein Computer weiß nicht, was Zufall ist. Er kann nur logische Dinge 
berechnen.

Er kann also nur eine bekannte Zahl als Basis nehmen und daran eine 
wilde, aber immer gleiche Rechenoperation vornehmen, um auf die nächste 
Zufallszahl zu kommen.

Bei jedem Start des Controllers ist dieser Startwert gleich, daher immer 
die gleiche Zahlenfolge.

Es gibt aber die Möglichkeit, diesen "Seed" vorzugeben. Zum Beispiel mit 
dem Wert eines unbenutzten ADC-Einganges, der ein bisschen Rauschen 
empfängt.

von Johannes S. (Gast)


Lesenswert?


von Nop (Gast)


Lesenswert?

Martin schrieb:

> Wenn das irgendwas sicherheitskritisches ist

... dann nimmt man ohnehin nicht rand(). Aber wenn man rand() nimmt, 
weil es nicht sicherheitskritisch ist, kann man auch mit der Zeit 
seeden.

von Georg A. (georga)


Lesenswert?

Joachim B. schrieb:
> doch am ADC mit offener langer Leitung.
>
> Was die Antenne einfängt muss zufällig sein (glaube ich zumindest)

Halte ich für sehr gewagt. Einmal eine FFT drauf werfen und schon werden 
diverse Peaks (zB. n*50...) auftauchen. Das darf bei echtem Zufall nicht 
sein.

von Theor (Gast)


Lesenswert?

Andi schrieb:
> Verstehe ich nicht so ganz. Soll eine Zufallsfunktion nicht
> Zufallszahlen erzeugen? Was bringt mir das, wenn da immer die selben
> Zahlenfolgen bei herauskommen? Ist das dann nicht etwas nutzlos?


Das hat tatsächlich einen Nutzen.

Angenommen, Du willst ein Programm testen, dass Du gerade schreibst.

Programmierer wollen, dass ihre Programme sich vorhersehbar, auf eine 
genau bestimmte Weise verhalten.

Das muss man davon unterscheiden, dass sich ein Programm im Einsatz, 
durch Zufallszahlen zufällig verhält. In einem Spiel etwa, sollen Fische 
im Teich an zufälligen Stellen auftauchen oder zufällige Strecken 
entlangschwimmen.

Während der Tests aber, also während man das Programm noch schreibt, 
will der Programmierer testen, ob der Fisch, wenn eine bestimmte 
Zufallszahl genommen wird, auch genau eine zu dieser Zahl gehörende 
Strecke schwimmt (oder an einer zu dieser Zahl gehörenden Stelle 
auftaucht).

Dazu testet er mit rand() und einem bestimmten Initialisierungswert, 
damit er Veränderungen am Programmtext auch beurteilen kann, ob sie 
wirksam sind und wie gewünscht funktionieren.

Würde er tatsächliche Zufallszahlen zum Test nehmen, dann würde sich das 
Programm jedesmal anders verhalten und er müsste warten bis irgendwann 
einmal gerade die Zahl "gezogen" wird, für die er eine Änderung im 
Programm gemacht hat.

Analog gilt das für Folgen von Zufallszahlen. Der Programmierer kann 
damit das zeitlich ausgedehnte Verhalten und das letztliche Ergebnis 
testen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Arduino Fanboy D. schrieb:
> "Echte" Zufälle sind mit einen µC kaum zu erzeugen!

Doch: mit allem, was physikalisch bedingt zufällig ist. Ob das nun ein 
ADC-Eingang ist (besser als "offen" wäre die Beschaltung mit einer 
rauschenden Z-Diode), oder ob es andere nicht vorhersagbare Dinge wie 
der Zeitabstand zwischen Tastenbetätigungen oder etwas ganz anderes ist, 
muss man von Fall zu Fall selbst organisieren.

von Katatafisch (Gast)


Lesenswert?

Bei dem Thema fällt mir das hier wieder ein:

Für richtig gute Zufallszahlen hat das Unternehmen Cloudflare 100 
Lavalampen eingesetzt:
https://winfuture.de/news,100452.html
https://www.cloudflare.com/learning/ssl/lava-lamp-encryption/

Diese 100 Lampen werden von einer Kamera fotografiert, aus den Bildern 
werden Zufallszahlen generiert und damit werden letztendlich Schlüssel 
für SSL und TLS generiert.

von PittyJ (Gast)


Lesenswert?

Frag doch mal einen Maker, ob er dir nicht einen Robbi baut, der 
wirklich Würfel wirft und danach wieder einsammelt. Noch eine Kamera zur 
Erkennung der Augen, und schon gibt es Zufall.

von M. K. (sylaina)


Lesenswert?

Echten Zufall hat man doch nur wenn man als Basis z.B. das Rauschen 
eines Transistors mit rein nimmt: 
https://www.subroutine.info/elektronik/zufallsgenerator/

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

M. K. schrieb:
> Echten Zufall hat man doch nur wenn man als Basis z.B. das Rauschen
> eines Transistors mit rein nimmt

Nein, nicht nur. Man hat ihn überall, wo sich nicht vorhersagbare 
physikalische Effekte überlagern. Die Lavalampe wurde ja schon genannt.

Wenn man mit dem offenen ADC-Eingang allerdings nur das überall 
vagabundierende 50-Hz-E-Feld der Niederspannungsversorgung misst, dann 
hat man dadurch allein eben auch keinen Zufall.

: Bearbeitet durch Moderator
von Stefan F. (Gast)


Lesenswert?

Andi schrieb:
> Was bringt mir das, wenn da immer die selben
> Zahlenfolgen bei herauskommen? Ist das dann nicht etwas nutzlos?

Zum Beispiel wird diese Eigenschaft bei dem Spiel Senso (auch bekannt 
als Simon) ausgenutzt. Es erzeugt scheinbar zufällige Tonfolgen, die bei 
jeder Spielrunde um einen Ton länger werden. Die Ton-Sequenz muss nicht 
gespeichert werden, weil jede Berechnung immer die gleiche Zahlenfolge 
liefert.

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.