srand < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Hallo Zusammen,
im folgenden quellcode möchte ich den user am zahlenzufallsgenerator drehen lassen. Er soll dabei 6 verschiedene Zahlen bekommen und dann aufgefordert werden ob er nochmal spielen möchte..
mein problem ist bei der for-schleife die zeit, denn ich bekomme dann 6xdie gleiche zahl raus.... wie kann ich das ändern??
ich habs jetzt so gemacht dass ich srand(int)time(0) in meine Main genommen habe , jetzt gehts
->> dennoch möchte ich gern wissen wiso es jetzt geht, wird jetzt der zeitpunkt vom vorherigen wert jedesmal genommen
s0->s1->s2->s3...?? wie wird der zeitpunkt für die zufallszahl errechnet? danke...
1: | #include<iostream>
| 2: | #include<cstdlib>
| 3: | #include<ctime>
| 4: | using namespace std;
| 5: |
| 6: |
| 7: |
| 8: | int Lottozahlen(void);
| 9: | [blue] srand((int)(time(0))); [/blue]
| 10: | void main(){
| 11: |
| 12: | char f;
| 13: |
| 14: | do{
| 15: |
| 16: | for (int i=0;i<6;i++)
| 17: | {cout<<Lottozahlen()<<endl;
| 18: | }
| 19: | cout<<"Wollen Sie weiterspielen j/n:"<<endl;
| 20: | cin>>f;
| 21: | }while(f!='n');
| 22: |
| 23: |
| 24: |
| 25: | }
| 26: |
| 27: |
| 28: | int Lottozahlen (void)
| 29: | {
| 30: |
| 31: |
| 32: | int z =rand();
| 33: | return(1+(z%49));
| 34: | }
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:18 So 11.07.2010 | Autor: | rainerS |
Hallo!
> Hallo Zusammen,
>
> im folgenden quellcode möchte ich den user am
> zahlenzufallsgenerator drehen lassen. Er soll dabei 6
> verschiedene Zahlen bekommen und dann aufgefordert werden
> ob er nochmal spielen möchte..
>
> mein problem ist bei der for-schleife die zeit, denn ich
> bekomme dann 6xdie gleiche zahl raus.... wie kann ich das
> ändern??
> ich habs jetzt so gemacht dass ich srand(int)time(0) in
> meine Main genommen habe , jetzt gehts
>
> ->> dennoch möchte ich gern wissen wiso es jetzt geht,
> wird jetzt der zeitpunkt vom vorherigen wert jedesmal
> genommen
> s0->s1->s2->s3...?? wie wird der zeitpunkt für die
> zufallszahl errechnet? danke...
rand() liefert keine Zufallszahlen, sondern Pseudozufallszahlen. Das heisst, die Rückgabewerte von rand() sind
gleichverteilt, aber vorhersagbar. Um das zu umgehen, kannst du vor der Benutzung srand(Zahl) aufrufen und so einen Anfangszustand vorgeben. Wenn du nichts vorgibst, wird 1 genommen.
Viele Grüße
Rainer
|
|
|
|
|
hallo!
Das problem ist ein anderes.
Erstmal klar, man muß bei jedem Durchlauf des Programms einen anderen Startwert vorgeben, und das macht man gewöhnlich, indem man die aktuelle Zeit da reinfüttert. (Da die Zeit aber in Sekunden aufgelöst wird, wird dieses Programm bei mehrfachem Starten innerhalb einer Sekunde also auch gleiche Zahlen liefern)
Aber das Problem ist die Postion des srand ansich. Das ist ein Funktionsaufruf!
Aber so, wie er vorher da stand, also außerhalb der main(), sah das Dingen eher wie ein Prototyp aus, also Name mit Übergabeparameter einer Funktion, die später noch definiert wird.
Da die Funktion aber später nicht benutzt wird, gibt der Compiler höchstens ne Warnung raus, erzeugt aber dennoch das Programm. Und da in diesem das srand() nicht aufgerufen wird, gibt's stets die gleichen Zahlen.
|
|
|
|
|
okay vielen dank, ist jetzt nachvollziehbar
(auch für mich)
lg martina
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 20:13 So 11.07.2010 | Autor: | martina.m18 |
hallo nochmal,
ich hab nun ein weiteres problem und hab keine ahnung was falsch läuft.
mein vorhaben ist es mit der Funktion GleicheZahlen zu überprüfen ob alle zahlen zufällig gleich sind, wenn ja soll die schleife mit continue abgebrochen werden->praktisch neuer anlauf-> bei bool nein sollen die
werte die bereits im array hinterlegt sind, ausgespuckt werden.
Gleiche zahlen hab ich als bool dekl. und definiert.
-> nun soweit sogut, jedoch habe ich einen fehler :
mit if((GleicheZahlen(ArrayLotto,l) sagt mein compiler
dass ich keine zwei argumente übergeben kann, warum nicht
hab das in ähnlicher form (mit variabeln) schon mal gemacht, da
gings.
if( (GleicheZahlen(ArrayLotto,l)))continue;
else {for (int i=0;i<6;i++)
cout<<ArrayLotto[i];};
green] ok .. erledigt eigener fehler in der deklaration, habe den typ für die länge dort vergessn[/green]
|
|
|
|