Master Z Geschrieben 2. Februar 2004 Geschrieben 2. Februar 2004 Hi leute sorry wenn ich euch schon wieder nerve!Das andere Problem hat sich gelöst!Hat funguniert!Jetzt hab ich wieder mal ne frage!Versuche gerade in C 10 verschiedene Zufallszahlen auszugeben!Hab am Anfang mal ein paar sachen ausprobiert um mich mit rand() vertraut zu machen aber um 10 Zufallszahlen auszugeben benötigt man aber auch srand() was hat es mit srand() auf sich?Wie binde ich es in ein Programm ein? Hab da mal ein Programm geschrieben was einen Minimalwert und einen Maximalwert einliest und dann so lange Zufallszahlen ausgiebt, bis der Maximalwert erreicht wurde! #include<stdlib.h> #include"zufall.h" int main (void) { int min,max,zufall1; printf("Bitte geben sie den Minimalwerte ein!\n"); scanf("%d",&min); fflush(stdin); printf("Bitte geben sie den Maximalwert ein!\n"); scanf("%d",&max); fflush(stdin); do{ printf("\n"); zufall1=zufall(min,max); printf("Ihre Zufallszahl lautet: %d",zufall1); }while(max!=zufall1); getchar(); } --------------------------------------------------------------------------------------------------------- Funktion: int zufall(int min, int max) { int x; x=rand()%(max-min+1)+min; return x; } Zitieren
Knuddlbaer Geschrieben 2. Februar 2004 Geschrieben 2. Februar 2004 Sets a random starting point. void srand( unsigned int seed ); Parameters seed Seed for random-number generation Remarks The srand function sets the starting point for generating a series of pseudorandom integers. To reinitialize the generator, use 1 as the seed argument. Any other value for seed sets the generator to a random starting point. rand retrieves the pseudorandom numbers that are generated. Calling rand before any call to srand generates the same sequence as calling srand with seed passed as 1. Zitieren
Gast Saesh Geschrieben 2. Februar 2004 Geschrieben 2. Februar 2004 rand <stdlib.h> cplusplus.com int rand ( void ); Generate random number. Returns a pseudo-random number in the range from 0 to RAND_MAX constant. This is generated by an algorithm that returns a series of non-related numbers each time is called. This algorithm should be initialized to different starting points using function srand to generate more realistic random numbers. RAND_MAX is a constant defined in stdlib.h. Its default value is implementation defined. Parameters. (none) Return Value. An integer value between 0 and RAND_MAX. Portability. Defined in ANSI-C. Example. /* rand example */ #include <stdio.h> #include <stdlib.h> #include <time.h> int main () { /* initialize random generator */ srand ( time(NULL) ); /* generate some random numbers */ printf ("A number between 0 and RAND_MAX (%d): %d\n", RAND_MAX, rand()); printf ("A number between 0 and 99: %d\n", rand()%100); printf ("A number between 20 and 29: %d\n", rand()%10+20); return 0; } Output: A number between 0 and RAND_MAX (32767): 30159 A number between 0 and 99: 72 A number between 20 and 29: 23 A good way to generate almost-true random numbers is to initialize the random algorithm using srand with the current time in seconds as parameter, as obtained from time function included in <time.h>. And, generally, a good way to get an integer random number between a range is to perform a module (%) operation on a result provided by rand(): thus rand()%25 would be a random number between 0 and 24, both included. srand <stdlib.h> cplusplus.com void rand ( unsigned int seed ); Initialize random number generator. Uses seed parameter to set a new starting point for generating random numbers with rand. If seed is set to 1 the generator is reinitialized to its initial value as before any call to rand or srand. In order to generate true random numbers it is suggested to use as seed a value that changes often, like the one returned by time function included in <time.h> (the number of seconds elapsed since newyear 1970). Parameters. seed An integer value to be used as starting point with the pseudo-random number generator algorithm. Return Value. (none) Portability. Defined in ANSI-C. Example. /* rand/srand example */ #include <stdio.h> #include <stdlib.h> #include <time.h> int main () { /* initialize random generator */ srand ( time(NULL) ); /* generate some random numbers */ printf ("A number between 0 and 100: %d\n", rand()%100); printf ("A number between 20 and 30: %d\n", rand()%10+20); return 0; } Output: A number between 0 and 100: 93 A number between 20 and 30: 21 Quelle: http://www.cplusplus.com/ref/ Zitieren
nic_power Geschrieben 2. Februar 2004 Geschrieben 2. Februar 2004 Hallo, Ich bin mir nicht so ganz sicher, ob es wirklich hilft, wenn seitenlange auszüge aus englisch-sprachigen Manual-Pages oder Web-Seiten gepostet werden. Da sollte eigentlich der Link reichen. Das Thema rand()/srand() wurde schon öfter diskutiert, die Suchfunktion des Boards sollte also einige Treffer zu Tage bringen. rand() beruht auf einem Pseudozufallszahlengenerator. Diese haben die Eigenschaft, identische Zufallszahlenreihen zu liefern, sofern sie nicht mit einem zufälligen Wert initialisiert werden (bei gleichen Initialisierungswerten werden auch hier gleiche Zahlenketten geliefert, was unter Umständen nützlich sein kann). Empfehlenswert ist eine Initialisierung über die Zeit-Funktion oder das Auslesen eines Prozessor-Registers; einige Prozessoren besitzen "Zufallsregister" alternativ lassen sich auch Instruction-Counter oder Time-Register verwenden (wobei das recht komplex und nicht portabel ist). Die einfachste Variante wäre somit der Aufruf von: srand ( time(NULL) ); Nic Zitieren
Master Z Geschrieben 2. Februar 2004 Autor Geschrieben 2. Februar 2004 @nic_power Danke für deine Erklärung!Das mit den links hat mir aber auch ein wenig geholfen! Hab in mein Programm mal srand ( time(0) ); eingefügt!Jetzt bringt er wenigstens schon jedes mal ander Zufallszahlne, auch wenn ich den gleichen Startwert eingebe!Super! Werde mich einfach weiter damit beschäftigen, bis es funzt!Wenn ich noch Fragen habe melde ich mich einfach! Danke @all Zitieren
Master Z Geschrieben 3. Februar 2004 Autor Geschrieben 3. Februar 2004 Hi Leute warum funzt das blöde Prog. nicht?Kann mir jemand helfen?Ich will nur 10 Zufallszahlen ausgeben und danach den Benutzer nach einer Zahl fragen und prüfen ob diese Zahl vorhanden ist oder nicht!Muss das dumme Array abfragen,will aber nicht funzen! int zufall1[11]={}; #include<stdio.h> #include<stdlib.h> #include<time.h> int main (void) { int i,ausgabe,zahl,merker=0,a; srand ( time(0) ); for(i=0;i<11;i++) { ausgabe=rand(); zufall1=ausgabe; } for(i=0;i<11;i++) { printf("%d %d \n",zufall1,i); } printf("Bitte geben sie eine Zahl an:\n"); scanf("%d",&zahl); fflush(stdin); for(a=0;a<11;a++); { if(zahl==zufall1[a]) { merker=1; } else { merker=0; } } fflush(stdin); if(merker==1) { printf("Ihre zahl ist vorhanden!"); getchar(); } else { printf("Ihre zahl ist nicht vorhanden!"); getchar(); } getchar(); } Zitieren
nic_power Geschrieben 3. Februar 2004 Geschrieben 3. Februar 2004 Hallo, fflush(stdin); for(a=0;a<11;a++); { if(zahl==zufall1[a]) { merker=1; } else { merker=0; } } [/php] Das semikolon hinter der Schleife ist zuviel (if/else wird nur einmal und nicht innerhalb der Schleife ausgeführt). Ausserdem wird (wenn if/else innerhalb der Schleife wäre) der merker auf 0 gesetzt auf wenn die Zahl bereits gefunden wurde. Das fflush(stdin) sollte ausserdem raus (flush() auf Eingabestroeme ist _nicht_ definiert! Nic Zitieren
Master Z Geschrieben 3. Februar 2004 Autor Geschrieben 3. Februar 2004 Wie kann ich denn alle Elemente (Zufallszahlen des Arrays) abprüfen?(ohne for schleife?) Zitieren
nic_power Geschrieben 3. Februar 2004 Geschrieben 3. Februar 2004 Hallo, Eine for-Schleife zu verwenden ist schon ok. Aber: for(a=0;a<11;a++) ; [/php] Mit dieser Schleife wird nur a hochgezählt, nicht jedoch der if/else Zweig innerhalb der Schleife ausgeführt. Nach Ablauf der Schleife enthält a den Wert 11. [php] if(zahl==zufall1[a]) { merker=1; } else { merker=0; } Jetzt vergleichst Du das 12. Element Deines Arrays mit der Zahl. Da Du das Array aber nur als zufall1[11] deklariert hast, greifst Du auf nicht allokierten und initialisierten Speicher zu. Richtiger wäre: for(a=0;a<11;a++) { if(zahl==zufall1[a]) { merker=1; } else { merker=0; } } [/php] Leider funktioniert dies aber auch nicht, da Du wenn Du die Zahl gefunden (und damit den merker auf 1 gesetzt) hast, die Schleife nicht abbrichst. D.h. im nächsten Durchlauf wird der merker wieder auf 0 gesetzt (obwohl das element bereits gefunden wurde). Entweder Du brichst die Schleife ab, oder Du entfernst den "else"-Fall und initialisierst den merker vor der Schleife mit 0. Nic Zitieren
Master Z Geschrieben 3. Februar 2004 Autor Geschrieben 3. Februar 2004 Danke für deine Hilfe!Hab vorher merker mit 0 initialisiert und den else Zweig entfernt jetzt funzt es!Kannst du mir noch mal erklären,warum er es falsch macht, wenn ich den else Zweig drin lasse? Ich möchte jetzt noch ausgeben, welches Element die bestimmte Zufallszahl ist (nur wenn sie vorhanden ist!); Zitieren
nic_power Geschrieben 3. Februar 2004 Geschrieben 3. Februar 2004 Hallo, spiel doch einfach mal die Schleife auf dem Papier oder im Kopf durch. Der Einfachheit halber gehe ich davon aus, dass das zu findende Element im ersten Feld des Arrays steht. Beim ersten Schleifendurchlauf findest Du die Zahl (der Vergleich trifft zu) und Du setzt Deinen merker auf den Wert "1". im zweiten Durchlauf schlägt der Vergleich fehlt und Du setzt den merker (im "else"-Fall) wieder zurück auf den Wert 0, obwohl Du bereits einen Treffer hattest. Nach dem Beenden der kompletten Schleife trägt Dein merker den Wert "0" (Ausnahme: Es handelt sich um das letzte Element in Deinem Array). Nic Zitieren
Master Z Geschrieben 3. Februar 2004 Autor Geschrieben 3. Februar 2004 Es funguniert jetzt alles so wie ich es mir vorgestellt habe!Danke noch mal für deinen Hilfe! Zitieren
Knuddlbaer Geschrieben 3. Februar 2004 Geschrieben 3. Februar 2004 Oder man schaut es sich mal mit C++ an: Kompletter lauffähiger code: #include <stdlib.h> #include <time.h> #include <set> #include <iostream> using namespace std; int main(int argc, char * argv[]) { // Set damit jede Zufallszahl nur einmal vorkommt set<int> zufall; srand((unsigned)time(0)); // Solange laufen bis 10 unterschiedliche Zufallszahlen im set sind while(zufall.size()< 10) zufall.insert(rand()); cout<<"Geben Sie bitte eine Zahl ein"; // Hilfsausgabe das man auch mal die richtige Zahl erwischt beim testen )) copy(zufall.begin(),zufall.end(),ostream_iterator<int>(cout," ")); // Benutzer nach Zahl fragen int suchzahl; cin>>suchzahl; // Und prüfen ob die vorhanden ist. if(zufall.find(suchzahl)!=zufall.end()) cout<<"\nIhre Zahl war vorhanden"; else cout<<"\nIhre Zahl war NICHT vorhanden"; return 0; } [/PHP] Zitieren
nic_power Geschrieben 3. Februar 2004 Geschrieben 3. Februar 2004 Hallo, sicherlich läßt sich das Problem auch in C++ (oder einer anderen frei wählbaren Sprache) lösen, es wurde jedoch nach eine Lösung in C gefragt. Nic Zitieren
Knuddlbaer Geschrieben 4. Februar 2004 Geschrieben 4. Februar 2004 Joooo! Ich weiß. Da ich hier aber immer nur C Code sehe (ohne Codetags!) poste ich gerne mal eine alternative C++ Lösung dazu. C++ scheint hier ja kaum jemand zu machen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.