[Lekcja 21] Losowanie bez powtórzeń
Ostatnio zmodyfikowano 2013-02-23 20:57
Forneus Temat założony przez niniejszego użytkownika |
[Lekcja 21] Losowanie bez powtórzeń » 2013-02-22 18:45:46 Witam, mam problem z zadaniem z tej lekcji ponieważ mój program losuje z powtórzeniami. Załączam kod jak ktoś widzi straszny błąd to proszę o jakąś sugestię niekoniecznie konkretne gdzie co i jak chyba że inaczej się nie da. #include <iostream> #include <ctime> #include <cstdlib>
int wczytaj() { using namespace std; cout << "Podaj liczbe" << endl; int i; cin >> i; return i; }
int losuj() { return( rand() % 2 ) + 0; }
bool czywylosowana( int liczba, int tab[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( tab[ i ] == liczba ) return true; i++; } while( i < ile ); return false; }
int main() { using namespace std; srand( time( 0 ) ); int wylosowanych = 0; int moje[ 2 ]; int wylosowane[ 2 ]; do { moje[ wylosowanych ] = wczytaj(); wylosowanych++; } while( wylosowanych < 3 ); wylosowanych = 0; do { int liczba = losuj(); if( czywylosowana( liczba, moje, wylosowanych ) == false ) { wylosowane[ wylosowanych ] = moje[ liczba ]; wylosowanych++; } } while( wylosowanych < 2 ); wylosowanych = 0; do { cout << wylosowane[ wylosowanych ] << endl; wylosowanych++; } while( wylosowanych < 2 ); return 0; }
Z góry dzięki i pozdrawiam. |
|
jsc |
» 2013-02-22 20:03:16 Jeśli to tylko 2 liczby to zrób tak: wylosuj pierwszą, a drugą losuj, aż do momentu kiedy będzie nierówna pierwszej. |
|
Forneus Temat założony przez niniejszego użytkownika |
» 2013-02-23 19:14:23 Dzięki za szybką odp. sęk w tym, żeby potem w miarę prosto przerobić to na losowanie większej dowolnej ilości liczb z puli np 10 z 20, bez powtórzeń. Czy to raczej niemożliwe żeby kod był taki uniwersalny?
Ogólnym założeniem jest żeby program losował x liczb ze zbioru y liczb bez powtórzeń. te x liczb jest wczytywane do tabeli i oczywiście zapisuję ich adresy do nowej tabeli tak, abym mógł sobie losować np 5 adresów z puli od 0-9. I potem jak już wylosuję te adresy komórek bez powtórzeń to muszę za ich pomocą wywołać liczby wpisane wcześniej przez użytkownika - być może ten ostatni punkt spartoliłem?
|
|
usmiech |
» 2013-02-23 19:37:12 Podpowiedzialbym, ale znowu dostane po lbie, ze wklejam gotowce.... ciezko cos podpowiedziec do tego kodu, powiem jedno staram sie pisac jasne kody :) |
|
usmiech |
» 2013-02-23 19:46:57 Napisalem ten kod na dwa sposoby... no C++ to wielosc rozwiazan :) Teraz ucze sie klas, a ten kod to chwila przerwy. |
|
jsc |
» 2013-02-23 20:04:02 Tu trzeba sprawdzać czy wszystkie już wylosowane liczby (można zapisać w tablicy) są różne od bieżącej liczby. |
|
usmiech |
» 2013-02-23 20:04:35 Oki .. kawalek kodu :) for( i = 0; i < 10; i++ ) { cout << "Podaj 10 liczb # " << i << ": "; cin >> liczbyPodane[ i ]; }
for( j = 0; j < 8; j++ ) { liczbyWylosowane[ j ] = 0; } for( j = 0; j < 8; ) { liczbyWylosowane[ j ] = rand() % 10 + 1; bool liczbaPowtarzaSie = false; for( int k = 0; k < j; ++k )
|
|
usmiech |
» 2013-02-23 20:46:50 A to kawalek drugiego kodu :) int nastepna_dostepna( int n ) { int i = 0; while( liczba_wybrana[ i ] ) i++; while( n-- > 0 ) { i++; while( liczba_wybrana[ i ] ) i++; } liczba_wybrana[ i ] = true; return i; } |
|
« 1 » 2 |