mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rand - Funktion ?


Autor: Michael Peters (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !
Kurze Frage: Warum bekomme ich immer eine 1 als Lösung bei dieser 
Routine heraus?


#include <stdio.h>
#include <stdlib.h>


int zuf;

int main()
{

  zuf = (rand() % 20)+1;
  printf("Zufallszahl: %d \n",zuf);

  return (0);
}

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist Zufall!

Nee, Scherzchen, rand() ist Pseudorandom, Du muß den Generator mit 
Zufall 'seeden', z.B. so:

#include <time.h>
....
srand( (unsigned)time( NULL ) );

Mit srand() verpaßt Du den Zufallszahlengenerator nen Startwert. Gleiche 
Startwerte führen zu identischen Folgen von 'Zufallszahlen', 
uninitialisierte Startwerte auch.

Cheers
Detlef

Autor: Michael Peters (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jou Danke für die Info1
Allerdings, wie bekomme ich jetzt meinen Rückgabewert in Bezug auf mein 
Beispiel?
Bin leider nicht der beste Programmierer...!

zuf =


Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest dir Literatur zulegen.

Wie funktioniert rand().

Zunächst mal: Hinter rand() steckt eine Formel!
Normalerweise sind das Formeln in der Gestalt:

   neuer_Wert = irgendeine_Funktion( alter_Wert )
   alter_Wert = neuer_Wert

Jedesmal wenn rand() afgerufen wird, wird also eine
Variable mit einer Formel verwurschtet und das
Ergebnis wieder in die Variable zurückgeschrieben.
Dieses Ergebnis dient dann beim nächsten Aufruf
von rand() wieder als Ausgangswert um mit der
Funktion verwurschtet zu werden welcher wiederrum
der Ausgangswert für den nächsten Aufruf von rand()
darstellt, use. usw.

Das heist aber auch: Wenn man immer mit dem selben
Startwert beginnt, dann liefert rand() auch immer
dieselbe Folge an Zufallszahlen.

Um hier echten Zufall hineinzubekommen, brauchst du
also noch irgendetwas möglichst zufälliges um den
Startwert (den ersten alter_Wert) festzulegen. Nur
dann liefert rand() auch andere Folgen von Zufallszahlen.

* Den Startwert setzt man mittels srand()
  Den Startwert darf man aber nur einmal in einem
  Programmlauf mit srand() setzen!

* Wo du den ersten Wert herkriegst, hängt von deinen
  Möglichkeiten ab.
  Wenn dein Programm irgendwelche Tastendrücke auswertet,
  kann man die Zeit zwischen 2 Tastendrücken dafür hernehmen.
  Oder man nimmt die aktuelle Systemzeit (in Millisekunden)
  her.
  Hier gibt es keine allgemeinen Regeln, du nimmst was du hast.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
  int zuf;

  srand( (unsigned)time( NULL ) );

  zuf = (rand() % 20)+1;
  printf("Zufallszahl: %d \n",zuf);

  return EXIT_SUCCESS;
}

Beachte aber:
Obige Zahlen werden nicht sehr zufällig sein.
Das liegt daran, dass man von einer einzigen Zahl nicht
sagen kann, ob sie zufällig ist oder nicht. Ist 5 zufällig,
oder 9?

Zufall ist eine statistische Eigenschaft. Und wie alle
statistischen Eigenschaften kann man Aussagen erst dann
treffen, wenn man eine größere Menge betrachtet.
Ist die Folge
  1 4 1 5 9 2 6 5 4
zufällig? Mag sein. Die Folge geht noch weiter und soweit
ich mich erinnern kann absolviert diese Folge eine Menge
von statistischen Tests auf Zufälligkeit ohne Probleme.

Wie würde deine Antwort ausfallen, wenn ich diese Folge
anders aufschreibe:

  3.141562654...

also: PI  Akzeptierst du sie jetzt noch als Zufall?

Autor: klugscheissender Rahul, manchmal auch fies (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du solltest dir Literatur zulegen.

"The Wee Free Men" von Terry Pratchett kann ich empfehlen... ;-)

Autor: Sippi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann "Häger, viel Feind viel Ehr" empfehlen...

Autor: klugscheissender Rahul, manchmal auch fies (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich kann "Häger, viel Feind viel Ehr" empfehlen...
Stimmt. Das hab ich auch...

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klugsein kann ich auch.

- Die Figur heißt 'Hägar' und nicht "Häger"
- Pi lautet 3.141592654... und nicht >>3.141562654...<<
Beide Zahlen sind aber voll total zufällig und für nen echten hardcore 
Ing. gilt sowieso pi=3 .

Gute Nacht
Detlef

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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