Zufallzahlen in Ansi-C

ollek81

Erfahrenes Mitglied
Tach!!

Ich muss mich jetzt wegen dem Studium mit ANSI-C beschäftigen. Gibt schlimmeres. Hab mir'n Buch geholt und geht auch alles recht flott voran. Allerdings hab ich 2 Probleme:

1. Wenn ich ne Zufallszahl machen will, nehme ich doch srand(irgendwas) und dann rand(); , oder?? Allerdings spuckt der bei mir IMMER ne 10-stellige Zahl aus. Wenn ich das Programm dann nochmal starte, nimmt er wieder die GLEICHE Zahl. Ist das normal?? Wenn, dann ist es ja nicht gerade sinnvoll. Wenn ich nochmal rand(); im selben Programm aufrufe, nimmt er auch ne neue (10-stellige) Zahl.

2. Sagt euch "fflush(stdin);" was?? Der Befehl soll den Eingabepuffer löschen, wenn ich z.b. nur 8 Stellen in ne Variable einlesen will, man aber 9 Stellen eingibt. Geht aber nicht. Der überspringt dann einfach die nächste Eingabe, und weist der Var. dann die restlichen Stellen zu... Wer weiß Rat??

Quelltexte sind angehängt...

Bin noch blutiger Anfänger in C, also bitte für doofe erklären!!:p

ollek81
 

Anhänge

  • quelltxt.zip
    1.015 Bytes · Aufrufe: 18
zum ersten:
das problem bei zufallszahlen ist, dass diese auf irgendwelchen werten basieren. dieser startwert ist normalerweise bei jedem programmstart gleich. wenn du wirkliche zufallszahlen haben willst, würd ich als startwert den aktuellen timestamp nehmen. ;)
das mit den zehn stellen kann ich gerade nicht nachvollziehen. wenn ich das kompiliere sind die zahlen vierstellig.

zum zweiten kann ich leider nichts sagen.
 
Tach!

Ja, sorry! Ich vergaß: Ich compiliere das mit gcc (oder nennt sich das gnu?? [gcc -ansi abcd.c]). Und zwar unter cygwin, falls dir das was sagt... Wahrscheinlich wird's daran liegen. Das, was ich da programmieren soll, muss nämlich später in ner Unix-Umgebung laufen. Deswegen hat man uns dieses cygwin an die Hand gegeben.
Naja, muss ich dann wohl mit leben...

Thanx für's erste!!! ;-)

ollek81
 
hallo
wegen den zufallszahlen:
auf der seite http://www.angrenost.de/pyro-balrog/ findest du ein
kleines programm (mit und ohne sourcecode) zum download in dem
zufallszahlen generiert werden. also nicht immer wieder dieselben :)
der code ist einigermaßen gut kommentiert. probiers einfach mal aus
 
Ah.. endlich mal eine echte C Frage ;) (zwei eigentlich)

zu 1.:

Der C-Zufallszahlengenerator basiert (wie die meisten anderen auch) auf einem "seed" (beliebige Zahl), wenn dieser seed gleich ist (d.h. bei dir gleiches Geburtsdatum) ist auch das Ergebnis immer gleich.
Normalerweise initialisiert man ihn mit der aktuellen Zeit:

srand((unsigned int)time(NULL));
Du kannst natürlich die aktuelle Zeit mit deinen Zahlen kombinieren (tag, monat, jahr).
Wenn du für das selbe Geburstdatum am selben Tag immer das selbe Ergebnis willst solltest du statt time() (Zeit in Sekunden seit 1.1.1970) nur den Tag verwenden (z.b. den Rückgabewert von time() mit localtime() in eine struct tm umwandeln und tag, monat, jahr darausnehmen und mit dem geburtsdatum kombinieren).

Das Problem mit der "langen Zahl" ist, dass rand() einen Wertebereich von 0 bis RAND_MAX.
Du kannst diesen jedoch wie folgt z.b. auf 1-20 skalieren:

1 + (int) (20.0 * rand()/(RAND_MAX+1.0))

(Diese Methode ist allerdings nicht die beste, für eine bessere siehe die C++ FAQ Lite)

zu 2.:
fflush() funktioniert nur mit Output-Streams.
Leere Input-Streams einfach indem du den Rest ausliest und verwirfst (siehe ebenfalls die C++ FAQ Lite für ein Beispiel)
 
Hi!

Thx, ihr beiden!!!
Das hat sich aber nu schon erledigt. Die Zufallszahlen hab ich seien gelassen *g*, werd mich da aber sicher irgendwann nochmal darum kümmern. Und das mit dem fflush hab ich auch gelöst. Wie schon vorgeschlagen, einfach mit auslesen des Restes.

Adiós!!

ollek81
 

Neue Beiträge

Zurück