Ĺadny brzuch
napisałem program który losuje liczby 6 z 49 i 20 z 80 tak aby liczby sie niepowtarzały. w dev-ie działa bez problemu a w BCB6 jak go umieściłem to już nie działa powtarzaja sie. oto kod
void __fastcall TForm1::Button1Click(TObject *Sender) { int k,i,wynik; srand((unsigned int)time(NULL)); if (RadioGroup1->ItemIndex==0) { int tab6z49[6]={0,0,0,0,0,0}; for(i=0; i<6; i++) { k=rand()%49+1; wynik=sprawdz(k,tab6z49); if(wynik==1) tab6z49[i]=k; else i--; //bedzie ponowne losowanie } ... // tutaj wypisuje wynik z tabeli do Edita } else { int tab20z80[20]; for(i=0; i<20; i++) tab20z80[i]=0; //wypełniam zerami zeby nie było przypadkowych wartości for(i=0; i<20; i++) { k=rand()%80+1; wynik=sprawdz(k,tab20z80); if(wynik==1) tab20z80[i]=k; else i--; //bedzie ponowne losowanie } ... // tutaj wypisuje wynik z tabeli do Edita } }
a sama funkcja która sprawdza wygląda nastąpujaco
int sprawdz(int liczba, int tablica[]) { int size=sizeof(tablica)/sizeof(int); for(int m=0; m<size; m++) if(liczba==tablica[m]) return 0; //licz juz jest w tablicy return 1; //nie było jej }
na formie jest umieszczone RadioGroup i dwie opcje (duży lotek i multi lotek), jak losuje na dużym lotku wszystko jest ok, liczby sie nie powtażaja, a na multi już sie powtarzaja. niech ktoś mi powie dlaczego przecież kożystaja z tej samej funkcji.
powtarzam tylko że w dev-c++ generuje dla obu tablic liczby niepowtażające sie.
1-49bool sprawdz(int x, int t[]) { bool r=false; for (int i=0; i<sizeof(t)/4; i++) if (t[i]==x) { r=true; break; } return r; } void __fastcall TForm1::Button1Click(TObject *Sender) { Edit1->Clear(); int liczby[6]={0,0,0,0,0,0}, k=1; srand((unsigned int)time(NULL)); for (int i=0; i<6; i++) { do { k = rand()%49+1; Edit1->Text = Edit1->Text+k+" "; } while (sprawdz(k,liczby)); } }
może nie zauważyłeś ale w twoim kodzie tablica wciąż jest wypełniaona zerami i operacja typu
if (t[i]==x) { r=true; break; } nigdy nie bedzie true bo wylosowana liczba nie bedzie zerem, no i nigdzie w twoim kodzie niema zapisania do tablicy liczby wylosowanej, to z czym ty chcesz kolejne wylosowane liczby porównywać. a ta moja funkcja działa dla 6 z 49 a nie działa dla 20 z 80 - takie losowanie własnie mi nie działało na tej samej funkcji (przypominam 6 z 49 losuje bez powtórek).
Kody wyglądają podobnie, więc może to, że dla sześciu liczb są różne, to przypadek... Ja dopisałbym do funkcji sprawdź trzeci parametr: długość tablicy. Zamiast wykorzystywania operatora sizeof. Wiem, że to może nie rozwiązać problemu, ale ja po prostu nie mam zaufania do tego operatora. :P Spróbuj, może pomoże?
Kody wyglądają podobnie, więc może to, że dla sześciu liczb są różne, to przypadek... Ja dopisałbym do funkcji sprawdź trzeci parametr: długość tablicy. Zamiast wykorzystywania operatora sizeof. Wiem, że to może nie rozwiązać problemu, ale ja po prostu nie mam zaufania do tego operatora. :PÂ Spróbuj, może pomoże?
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
void __fastcall TForm1::Button1Click(TObject *Sender) { int k,i,wynik; srand((unsigned int)time(NULL)); if (RadioGroup1->ItemIndex==0) { int tab6z49[6]={0,0,0,0,0,0}; for(i=0; i<6; i++) { k=rand()%49+1; wynik=sprawdz(k,tab6z49); if(wynik==1) tab6z49[i]=k; else i--; //bedzie ponowne losowanie } ... // tutaj wypisuje wynik z tabeli do Edita } else { int tab20z80[20]; for(i=0; i<20; i++) tab20z80[i]=0; //wypełniam zerami zeby nie było przypadkowych wartości for(i=0; i<20; i++) { k=rand()%80+1; wynik=sprawdz(k,tab20z80); if(wynik==1) tab20z80[i]=k; else i--; //bedzie ponowne losowanie } ... // tutaj wypisuje wynik z tabeli do Edita } }
a sama funkcja która sprawdza wygląda nastąpujaco
int sprawdz(int liczba, int tablica[]) { int size=sizeof(tablica)/sizeof(int); for(int m=0; m<size; m++) if(liczba==tablica[m]) return 0; //licz juz jest w tablicy return 1; //nie było jej }
na formie jest umieszczone RadioGroup i dwie opcje (duży lotek i multi lotek), jak losuje na dużym lotku wszystko jest ok, liczby sie nie powtażaja, a na multi już sie powtarzaja. niech ktoś mi powie dlaczego przecież kożystaja z tej samej funkcji.
powtarzam tylko że w dev-c++ generuje dla obu tablic liczby niepowtażające sie.
1-49bool sprawdz(int x, int t[]) { bool r=false; for (int i=0; i<sizeof(t)/4; i++) if (t[i]==x) { r=true; break; } return r; } void __fastcall TForm1::Button1Click(TObject *Sender) { Edit1->Clear(); int liczby[6]={0,0,0,0,0,0}, k=1; srand((unsigned int)time(NULL)); for (int i=0; i<6; i++) { do { k = rand()%49+1; Edit1->Text = Edit1->Text+k+" "; } while (sprawdz(k,liczby)); } }
może nie zauważyłeś ale w twoim kodzie tablica wciąż jest wypełniaona zerami i operacja typu
if (t[i]==x) { r=true; break; } nigdy nie bedzie true bo wylosowana liczba nie bedzie zerem, no i nigdzie w twoim kodzie niema zapisania do tablicy liczby wylosowanej, to z czym ty chcesz kolejne wylosowane liczby porównywać. a ta moja funkcja działa dla 6 z 49 a nie działa dla 20 z 80 - takie losowanie własnie mi nie działało na tej samej funkcji (przypominam 6 z 49 losuje bez powtórek).
Kody wyglądają podobnie, więc może to, że dla sześciu liczb są różne, to przypadek... Ja dopisałbym do funkcji sprawdź trzeci parametr: długość tablicy. Zamiast wykorzystywania operatora sizeof. Wiem, że to może nie rozwiązać problemu, ale ja po prostu nie mam zaufania do tego operatora. :P Spróbuj, może pomoże?
Kody wyglądają podobnie, więc może to, że dla sześciu liczb są różne, to przypadek... Ja dopisałbym do funkcji sprawdź trzeci parametr: długość tablicy. Zamiast wykorzystywania operatora sizeof. Wiem, że to może nie rozwiązać problemu, ale ja po prostu nie mam zaufania do tego operatora. :PÂ Spróbuj, może pomoże?
