Forum: Mikrocontroller und Digitale Elektronik Rand - Funktion ?


von Michael Peters (Gast)


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);
}

von Detlef _. (detlef_a)


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

von Michael Peters (Gast)


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 =


von Karl heinz B. (kbucheg)


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.

1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <time.h>
4
5
int main()
6
{
7
  int zuf;
8
9
  srand( (unsigned)time( NULL ) );
10
11
  zuf = (rand() % 20)+1;
12
  printf("Zufallszahl: %d \n",zuf);
13
14
  return EXIT_SUCCESS;
15
}

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?

von klugscheissender Rahul, manchmal auch fies (Gast)


Lesenswert?

>Du solltest dir Literatur zulegen.

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

von Sippi (Gast)


Lesenswert?

Ich kann "Häger, viel Feind viel Ehr" empfehlen...

von klugscheissender Rahul, manchmal auch fies (Gast)


Lesenswert?

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

von Detlef _. (detlef_a)


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

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.