mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Andi (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Hallo,

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

Autor: Teo D. (teoderix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil rand() Pseudozufälle liefert!

Nutze seed() o.ä.

Autor: Thomas Z. (Firma: Unaffiliated) (usbman)
Datum:

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

Thomas

Autor: Markus M. (adrock)
Datum:

Bewertung
0 lesenswert
nicht 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.ä.

Autor: Martin (Gast)
Datum:

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

Autor: Andi (Gast)
Datum:

Bewertung
-5 lesenswert
nicht 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?

Autor: Georg A. (georga)
Datum:

Bewertung
2 lesenswert
nicht 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.

Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Joachim B. (jar)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Sebastian R. (sebastian_r569)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Johannes S. (jojos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Nop (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Georg A. (georga)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Theor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht 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.

Autor: Katatafisch (Gast)
Datum:

Bewertung
3 lesenswert
nicht 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.

Autor: PittyJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: M. K. (sylaina)
Datum:

Bewertung
0 lesenswert
nicht 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/

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Stefanus F. (Firma: Äppel) (stefanus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.