Varrius Geschrieben 7. April 2004 Geschrieben 7. April 2004 hi, hab mich schon im forum umgeguckt, aber nicht das finden können wie ichs brauch. da ich grad erst mit c++ angefangen hab, kenn ich noch nicht alle funktionen und befehle. hab aber schon mit TP programmiert (teilweise hardcore ) als einstiegs program, wollt ich lottoziehungen simulieren. das problem mit den verschiedenen zufallszahlen hab ich schon hinbekommen, leider krieg ich bei jeder ziehung die identischen zahlen, kann mir da jemand helfen. lauffähiger code: #include <iostream.h> #include <stdlib.h> #include <time.h> #include <set> #include <iostream> int zahlen[49]; int favoriten[6][2]; void initialisieren() {int n; for (n=0;n<49;n=n+1) zahlen[n]=0; } void ziehung() { set<int> zufall; srand((unsigned)time(0)); while(zufall.size()< 6) zufall.insert(rand()%49+1); copy(zufall.begin(),zufall.end(),ostream_iterator<int>(cout," ")); cout<<endl; int suchzahl; for (suchzahl=0;suchzahl<49;suchzahl=suchzahl+1) if(zufall.find(suchzahl)!=zufall.end()) zahlen[suchzahl]++; } void ausgabe() {int index; cout<<endl; for (index=0;index<6;index=index+1) cout<<index+1<<". Platz: "<<favoriten[index][0] <<" H\x84ufigkeit: "<<favoriten[index][1]<<endl; for (index=0;index<49;index=index+1) cout<<index+1<<" : "<<zahlen[index]<<endl; } void sortieren() {int index,merke,max,zaehl; for (zaehl=0;zaehl<6;zaehl=zaehl+1) {max=0; merke=0; for (index=0;index<49;index=index+1) if (zahlen[index]>max) merke=index; favoriten[zaehl][0]=merke; favoriten[zaehl][1]=zahlen[merke]; zahlen[merke]=0; } } int main() { initialisieren(); int anzahl,index; cout<<"Wieviel Ziehungen sollen durchgegangen werden?"<<endl; cin>>anzahl; for (index=0;index<anzahl;index=index+1) ziehung(); sortieren(); ausgabe(); system("PAUSE"); return 0; } danke PS: wo find ich anleitungen zu grafiken in c++? Zitieren
Master Z Geschrieben 7. April 2004 Geschrieben 7. April 2004 Hi ! Dein problem ist, dass du die interne Zeit des Computers mit einbeziehen musst! Ich kann dir nur erklaeren wie das in C geht! In C wuerde das dann so aussehen! time_t sek; time(&sek); srand(sek); Hab dein prog nur mal ueberfloen! Arbeitest du mit der rand() funktion? Zitieren
Varrius Geschrieben 7. April 2004 Autor Geschrieben 7. April 2004 srand((unsigned)time(0)); while(zufall.size()< 6) zufall.insert(rand()%49+1); also das srand bezieht sich ja eigentlich auf die systemzeit und wie man sieht, benutz ich rand, leider halt jedes mal die gleichen zahlen Zitieren
Master Z Geschrieben 7. April 2004 Geschrieben 7. April 2004 das ist schon korrekt!Du brauchst aber auch noch das srand(), dem du auch die Zeit zuweisen musst wie in meinem Beispiel!rand() arbeitet naehmlich mit der srand() Funktion!Ich schaetze mal das deine Zuweisung falsch ist* srand((unsigned)time(0));* Zitieren
Master Z Geschrieben 7. April 2004 Geschrieben 7. April 2004 Hab mal fuer dich den Lottogenerator in C geschrieben! -------------------------------------------------------------------------------------------------------- Die main!!!! int lotto[6]; int pruef[50]={0}; #include <stdio.h> #include <stdlib.h> #include "ausgabe2.h" #include "initarray.h" int main(void) { printf("*****************************************************\n"); printf("* *\n"); printf("* Lottozahlengenerator *\n"); printf("* *\n"); printf("*****************************************************\n\n\n"); printf("Das sind ihre Lottozahlen!\n\n"); init_array(); ausgabe(); getchar(); } --------------------------------------------------------------------------------------------------------- int zufall(int min ,int max) { int x; x=rand()%(max-min+1)+min; return x; } ---------------------------------------------------------------------------------------------------------- #include<time.h> #include "zufall.h" void init_array(void) { int i,j,a; time_t sek; time(&sek); srand(sek); for(i=0;i<6;i++) { lotto = zufall (1,49); j=0; while(j<i) { if(lotto == lotto[j] ) { lotto[j] = zufall(1,49); j=0; } else { j++; } } } for(a=0;a<6;a++) { pruef[lotto[a]]=1; } } ---------------------------------------------------------------------------------------------------------- void ausgabe (void) { int a; for(a=0;a<50;a++) { if (pruef[a] == 1) printf("%i\t ",a+1); } } Zitieren
Varrius Geschrieben 7. April 2004 Autor Geschrieben 7. April 2004 krieg dein prog nicht zum laufen, da mir ein paar deiner *.h dateien fehlen aber ich glaube dein prog liefert nur 6 verschiede zufallszahlen, aber man kann das nicht wiederholen der sinn soll sein, dass das prog x beliebig viele ziehungen simuliert und eine toplist der meisten zahlen ausgeben kann Zitieren
Master Z Geschrieben 7. April 2004 Geschrieben 7. April 2004 Um das zu realisieren muesste man einfach noch ne schleife rum bauen bei der der Benutzer am ende gefragt wird wieder neue Zufallszahlen erzeugt werden!Das mit der Toplist kann man bestimmt auch machen!Hast du einen C Compiler wo du das prog ausprobieren kannst PS du musst du .h dateien unter dem Namen abspeichern wie du sie aufrufst! Bsp #include "ausgabe2.h" muss auch unter ausgabe2.h abgespeichert werden! Zitieren
nic_power Geschrieben 7. April 2004 Geschrieben 7. April 2004 Hallo, Zum Thema Zufallszahlen in C (und warum diese ohne ein "srand(time(NULL))" nicht wirklich zufällig sind gabs schon diverse Threads, die sich über die Suchfunktion finden lassen: http://forum.fachinformatiker.de/showthread.php?s=&threadid=59059&highlight=srand http://forum.fachinformatiker.de/showthread.php?s=&threadid=59059&highlight=srand Nic Zitieren
Varrius Geschrieben 7. April 2004 Autor Geschrieben 7. April 2004 man muss nicht zweimal auf den gleichen thread verweisen ich hab diesen thread auch schon gelesen und daher auch schon diese fast zufallszahl, so das ich zumindest nach jedem programstart andere zahlen hatte ich will aber im programm mehrere male die zufallszahlen bekommen, leider funzt das nicht so ordentlich und dazu hatte ich kein thread gefunden Zitieren
nic_power Geschrieben 7. April 2004 Geschrieben 7. April 2004 Hallo, Original geschrieben von Varrius man muss nicht zweimal auf den gleichen thread verweisen hatte ich auch nicht vor, war wohl ein Cut&Paste Fehler . Wichtig ist, dass Du den Pseudozufallszahlengenerator mit einem passenden Wert initialisierst ("seed"), da ansonsten identische Werte zurückgeliefert werden. Wie Du den Seed-Wert ermittelst ist prinzipiell egal (sofern er sich ändert). Nic Zitieren
Master Z Geschrieben 8. April 2004 Geschrieben 8. April 2004 Original geschrieben von Varrius man muss nicht zweimal auf den gleichen thread verweisen ich hab diesen thread auch schon gelesen und daher auch schon diese fast zufallszahl, so das ich zumindest nach jedem programstart andere zahlen hatte ich will aber im programm mehrere male die zufallszahlen bekommen, leider funzt das nicht so ordentlich und dazu hatte ich kein thread gefunden Du hast gesagt, dass du bei jedem Programmstart neue zahlen bekommst!Warum baust du nicht eine schleife um dein Programm, wo der Benutzer gefragt wird ob neue zufallszahlen erzeugt werden sollen?Vorher musst du natürlich den Bildschirm leeren! Zitieren
Varrius Geschrieben 8. April 2004 Autor Geschrieben 8. April 2004 Original geschrieben von Master Z Du hast gesagt, dass du bei jedem Programmstart neue zahlen bekommst!Warum baust du nicht eine schleife um dein Programm, wo der Benutzer gefragt wird ob neue zufallszahlen erzeugt werden sollen?Vorher musst du natürlich den Bildschirm leeren! wie soll ich ein schleife um das programm machen? wenn ich die aufrufe der funktionen in eine schleife mache, kommt immer das gleiche raus was bewirkt "seed" und wie muss man es aufrufen bzw. was muss man includen? Zitieren
Master Z Geschrieben 8. April 2004 Geschrieben 8. April 2004 Ich könnte dir ja mal ein komplettes Programm schicken wenn du wills, wo am schluss der Benutzer gefragt wird ob neue zahlen erzeugt werden sollen!Hast du einen C-Compiler? Zitieren
nic_power Geschrieben 8. April 2004 Geschrieben 8. April 2004 Hallo, die "seed" initialisiert den Pseudozufallszahlengenerator der von rand() verwendet wird. Dabei wird pro seed eine Reihe von Zufallszahlen erzeugt. Verwendest Du die gleiche seed mehrmals werden auch identische Zufallszahlenreihen generiert (was unter Umständen gewünscht sein kann). Du solltest 1x am Anfang deines Programmes die seed über srand(time(NULL)) setzen. @Master Z: Poste doch das Programm im Forum. Allzulang kann es ja nicht sein und dann haben auch alle was davon Nic Zitieren
Master Z Geschrieben 8. April 2004 Geschrieben 8. April 2004 Also denn!! #include <stdio.h> #include <stdlib.h> #include <time.h> #include "bubblesort1.h" #include "ausgabe5.h" #include "zufall5.h" int main (void) { time_t sek; time(&sek); srand(sek); int laenge=10; int a_zahlen[10]; int *p_int1=&a_zahlen[0]; char weiter; do{ system("cls"); zufall5(laenge,p_int1); bubblesort(p_int1,laenge); ausgabe(laenge,p_int1); printf("\n\n\n"); printf("Nochmal? ja(j) nein(n)\n"); scanf("%c",&weiter); fflush(stdin); }while (weiter == 'J' || weiter == 'j'); } --------------------------------------------------------------------------------------------------------- void ausgabe (int laenge,int* p_int2) { int i; for(i=0;i<laenge;i++) { printf(" %d,",*(p_int2+i)); } } ---------------------------------------------------------------------------------------------------------- #include "vertausche.h" void bubblesort(int*p_int,int laenge) { int fertig=1,i,j; for(i=laenge;i>1 && fertig == 1;i--) { fertig=0; for(j=1;j<i;j++) { if(*(p_int+(j-1)) > *(p_int+j)) { vertausche(p_int+(j-1),p_int+j); fertig=1; } } } } ----------------------------------------------------------------------------------------------------------- void vertausche(int*p_int1,int*p_int2) { int temp; temp=*p_int1; *p_int1=*p_int2; *p_int2=temp; } ---------------------------------------------------------------------------------------------------------- void zufall5(int laenge,int* p_int5) { int i,zufall; for(i=0;i<laenge;i++) { zufall=rand(); *(p_int5+i)=zufall; } } ---------------------------------------------------------------------------------------------------------- Das Programm erzeugt immer wieder 10 neue Zufallszahlen und sortiert sie aufsteigend von klein nach groß!:marine :marine Zitieren
Varrius Geschrieben 8. April 2004 Autor Geschrieben 8. April 2004 danke, ich werds mal probieren wenn ich zeit hab, leider hab ich zuviel mit'nem server am hut 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.