Arekadiusz Opublikowano 6 Października 2012 Udostępnij Opublikowano 6 Października 2012 Potrzebuję programu który będzie losował mi liczby bez powtórzeń z pobranego ze zmiennej przedziału liczb (np. 1-20). Losowanie mam ale nie wiem jak zrobić aby liczby się nie powtarzały i aby przedział był brany ze zmiennej. Z kolei ta zmienna ma być odczytywana z pliku ini. Szukałem w Google ale jakoś nie mogę nic znaleźć. Mam takie coś: srand( (unsigned)time( NULL ) ); char los[2]; los[0] = (rand()%10)+48; los[1] = NULL; MessageBox (NULL, los, "Losowanie", MB_OK); Będę wdzięczny za pomoc! :unsure: Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 6 Października 2012 Udostępnij Opublikowano 6 Października 2012 Najprościej: Możesz usuwać ze zbioru wylosowaną liczbę. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Arekadiusz Opublikowano 6 Października 2012 Autor Udostępnij Opublikowano 6 Października 2012 Najprościej: Możesz usuwać ze zbioru wylosowaną liczbę. No mogę tylko jak? Mam tak: los[0] = (rand()%10)+48; i jak mam z tego coś usunąć? No chyba że zrobić to jakoś innaczej ale nie bardzo wiem jak :( Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 6 Października 2012 Udostępnij Opublikowano 6 Października 2012 Wygeneruj tablicę lub wektor, wypełnij ja liczbami i losuj dopoki nie ma null. Jak wartość nie ma null, dopisz do wyniku i ustaw null. Sposób ma ta wadę że może powodować lag jeśli losujesz dużo liczb z małego przedziału. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Arekadiusz Opublikowano 7 Października 2012 Autor Udostępnij Opublikowano 7 Października 2012 Udało mi się stworzyć coś takiego ale niestety niedziała. Liczby się powtarzają. int i; for(i=0; i<=10; i++) { int ile=10; int losy[10]; int wszystkie[10]; losy[0]=1; losy[1]=1; losy[2]=1; losy[3]=1; losy[4]=1; losy[5]=1; losy[6]=1; losy[7]=1; losy[8]=1; losy[9]=1; losy[10]=1; srand( (unsigned)time( NULL ) ); char los[2]; los[0] = (rand()%ile)+48; los[1] = NULL; int losik=0; losik = (int) strtod(los, NULL); if (losy[losik]==0) { MessageBox (NULL, "Wylosowana liczba już była!", "Losowanie", MB_OK); } else { wszystkie-1; if (wszystkie==0) { MessageBox (NULL, "Koniec!", "Koniec", MB_OK); } losy[losik]=0; MessageBox (NULL, los, "Losowanie", MB_OK); } } Wiem o tym że tablicę "losy" mogę wypełnić od razu ale po prostu na razie zrobiłem tak żeby było czytelniej jak dla mnie. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Utermiko Opublikowano 7 Października 2012 Udostępnij Opublikowano 7 Października 2012 int ile=10; int wylosowane[10]; srand(static_cast<int>(time(NULL))); for(int i=0;i<10;++i) wylosowane[i]=-1; for(int i=0; i<10; ++i) { bool jr=false; int wylos=-1; while(true) { wylos=(rand()%ile)+48; for(int j=0;j<10;++j) { if(wylos==wylosowane[j]) jr=true; } if(jr==false) break; } wylosowane[i]=wylos; } Pisane na szybko, nie sprawdzałem. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Arekadiusz Opublikowano 7 Października 2012 Autor Udostępnij Opublikowano 7 Października 2012 Niestety liczby dalej mi się powtarzają :( Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Utermiko Opublikowano 7 Października 2012 Udostępnij Opublikowano 7 Października 2012 Aj, pomyłka xD Dałem "i" zamiast "j". Zamień if(wylos==wylosowane[i]) jr=true; na if(wylos==wylosowane[j]) jr=true; W poprzednim poście poprawiłem już. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Arekadiusz Opublikowano 7 Października 2012 Autor Udostępnij Opublikowano 7 Października 2012 No teraz niby wszystko jest dobrze tylko że program się zawiesza... :crying: Dodałem sobie wyświetlanie okienka z wylosowaną liczbą, wyświetlają się 3 albo 4 liczby i brak odpowiedzi... :( Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Utermiko Opublikowano 7 Października 2012 Udostępnij Opublikowano 7 Października 2012 Bo jeśli ma, np. wylosować 10 nie powtarzających się liczb całkowitych z zakresu 1-5 to się zawiesi, bo to nie możliwe. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Arekadiusz Opublikowano 7 Października 2012 Autor Udostępnij Opublikowano 7 Października 2012 Bo jeśli ma, np. wylosować 10 nie powtarzających się liczb całkowitych z zakresu 1-5 to się zawiesi, bo to nie możliwe. No tak ale nawet jeżeli wprowadzę jakąś liczbę np. 150 (int ile=150;) do kodu prosto skopiowanego z twojego posta to program zawiesza się gdzieś na 7 liczbie. Więc jak wielki mam podać przedział aby się nie zaciął!? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Tymon Opublikowano 7 Października 2012 Udostępnij Opublikowano 7 Października 2012 Wrzuć zbiór liczb do tablicy. Wymieszaj tablicę. Proste. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 8 Października 2012 Udostępnij Opublikowano 8 Października 2012 z tego co pamiętam, biblioteka algorithm miała funkcję od tasowania tablicy, bodaj shuffle_random czy jakoś podobnie. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Arekadiusz Opublikowano 8 Października 2012 Autor Udostępnij Opublikowano 8 Października 2012 Poszukałem w Google i jest taka funkcja tylko że nie bardzo wiem jak jej użyć i co ona ma mi dać. Znalazłem takie coś: void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator& rand ) Sorki że tak pytam o wszystko ale z C++ jestem początkujący. Mam nadzieję że pomożecie. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 8 Października 2012 Udostępnij Opublikowano 8 Października 2012 http://www.cplusplus.com/reference/algorithm/random_shuffle/ Tu masz nawet przykład stosowania. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Arekadiusz Opublikowano 10 Października 2012 Autor Udostępnij Opublikowano 10 Października 2012 Dobra dzięki już sobie poradziłem :) Tylko przy okazji mam jeszcze pytanko czy w WinApi mając kilka pól (EDIT) i przycisków (BUTTON) można podczas działania programu ustawić które pole ma być obecnie aktywne (w którym teraz należy pisać)? Szukałem w Google ale nie znalazłem takiej funkcji. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Utermiko Opublikowano 10 Października 2012 Udostępnij Opublikowano 10 Października 2012 Spróbuj poszukać. Słowa kluczowe: focus, winapi Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Arekadiusz Opublikowano 10 Października 2012 Autor Udostępnij Opublikowano 10 Października 2012 Spróbuj poszukać. Słowa kluczowe: focus, winapi O! Dzięki teraz jest pięknie! To jeszcze ostatnia sprawa... :/ Piszę sobie w polu tekstowym i chciałbym aby po wciśnięciu jakiegoś klawisza działa się dana akcja. Niestety obsługa klawiszy przy pomocy case WM_KEYDOWN nie działa pewnie dlatego że to pole tekstowe no ale ja chcem wykorzystać klawisz ENTER który nie jest używany bo to małe pole (EDIT) i nie przechodzi się tam do kolejnej linii. Chyba że można też w jakiś sposób użyć do tego tej funkcji SetFocus ale nie bardzo wiem jak :( Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Arekadiusz Opublikowano 12 Października 2012 Autor Udostępnij Opublikowano 12 Października 2012 Przepraszam że znów odświeżę ale pisząc sobie dziś spokojnie mały programik napotkałem się na problem i nie za bardzo wiem jak go rozwiązać. Potrzebuję porównać dwie zminne typu char. Mam w dużym skrócie takie coś: int ktora=5; //dla testu char* zmienna[10]; //...odczyt danych z pliku ini do zmiennej [i]zmienna[/i] prz użyciu pętli for GetPrivateProfileString(TEXT("Plik"), TEXT("5"), TEXT("blad"), zmienna[5], 80, TEXT(Nazwa)); //to tak w dużym skrócie :) DWORD dlugosc = GetWindowTextLength( hPole ); char *odpowiedz =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 ); GetWindowText( hPole, odpowiedz, dlugosc + 1 ); if (zmienna[ktora]==odpowiedz) { MessageBox( hwnd, "Dobrze", "Komunikat!", MB_ICONINFORMATION ); } Gdy w pliku ini jest to samo co ja wpiszę w pole, komunikat i tak się nie pokazuje :( Z tego co czytałem char można że sobą porównać używając == ale nie jestem pewien, dlatego chciałbym sie Was zapytać jak powinno być. Dzięki za pomoc! Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 12 Października 2012 Udostępnij Opublikowano 12 Października 2012 Tak, pojedyncze znaki można porównywać poprzez '==', są traktowane jak liczba. Łańcuchy natomiast poprzez strcmp (jeżeli zwróci zero, to oznacza że łańcuchy są identyczne). Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się