kirito1996 Temat założony przez niniejszego użytkownika |
losowanie bez powtórzeń » 2016-12-19 16:12:08 witam, jak się domyślacie mam problem z zadaniem ;) "no co ty gadasz ?!" problem występuję przy losowaniu liczb a wydaje mi się że konkretnie w funkcji czyBylaWyl(), wszystkie cout to mój że tak powiem debugger ;D jest to aktualne miejsce mojego utknięcia już próbowałem chyba wszystkiego, myślałem żeby ta funkcja sprawdziła czy liczby się powtarzają te wylosowane i napisać jeszcze jedną która sprawdzi obie tablice ale pierwszy if się wykonuję a o drugim ani widu ani słychu TREŚĆ ZADANIA: Napisz program, który wczyta 3 liczby podane przez użytkownika do tablicy, a następnie wylosuje 2 z nich bez powtórzeń. Wynik wypisz na ekran. Postaraj się napisać ten program w oparciu o funkcje. #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
bool czyBylaw( int iliczba, int tab_wp[], int wpisane ) { if( wpisane <= 0 ) return false; int i = 0; do { if( tab_wp[ i ] == iliczba ) { cout << "liczba " << iliczba << " znajduje sie juz w tablicy" << endl; return true; } i++; } while( i < wpisane ); return false; }
int wpisz( int tab_wp[] ) { int liczba; int wpisane = 0; bool literka; do { do { cin >> liczba; literka = cin.good(); cin.clear(); cin.sync(); } while( literka == 0 ); if( czyBylaw( liczba, tab_wp, wpisane ) == false ) { tab_wp[ wpisane ] = liczba; wpisane++; } } while( wpisane < 3 ); }
bool czyBylaWyl( int tab_wp[], int wpisane, int liczba, int tab_wyl[] ) { int i = 0; if( wpisane <= 0 ) { cout << "ok"; return false; } do { if( tab_wyl[ i ] == liczba ) { cout << "wyl == liczba ok"; return false; } i++; } while( i < wpisane ); return false; }
int wylosuj() { return rand(); }
int wpiszlos( int tab_wyl[] , int tab_wp[] ) { int wpisane = 0; int los; do { los = wylosuj(); if( czyBylaWyl( tab_wp, wpisane, los, tab_wyl ) == false ) { tab_wyl[ wpisane ] = los; wpisane++; } } while( wpisane < 2 ); }
int main() { srand( time( NULL ) ); cout << "podaj 3 liczby a wylosuje 2 nich:" << endl; int wpisane[ 3 ]; int wylosowane[ 2 ]; wpisz( wpisane ); wpiszlos( wylosowane, wpisane ); int i = 0; cout << "\n\n"; do { cout << wpisane[ i ] << endl; i++; } while( i < 3 ); i = 0; do { cout << wylosowane[ i ] << endl; i++; } while( i < 2 ); return 0; }
|
|
czaffik |
» 2016-12-19 17:34:22 Kod się wykona ale liczby wylosowane będą z dużym prawdopodobieństwem spoza zakresu tablicy ponieważ: 1. funkcja rand() zwraca wartości od 0 do RAND_MAX czyli równie dobrze może zwrócić 0 jak i 2394; 2. funkcja czyBylaWyl zawsze zwraca false (same return false).
Funkcja wylosuj powinna przyjmować jakiś zakres losowanych liczb, a najlepiej jakbyś losował nie same liczby tylko indeksy tablicy wpisane czyli rand()%3, wtedy mógłbyś tylko sprawdzić czy indeks się powtarza czy nie, w konsekwencji liczby też by się nie powtarzały bo przy wpisywaniu tablicy i tak wymuszasz niepowtarzalność wpisywanych liczb. |
|
kirito1996 Temat założony przez niniejszego użytkownika |
» 2016-12-19 18:07:15 aha no spoko to teraz mam tak #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
bool czyBylaWyl( int wylosowane[], int wylosowanych, int los ) { int i = 0; if( wylosowanych <= 0 ) return false; do { if( wylosowane[ i ] == los ) { return true; } i++; } while( i < wylosowanych ); return false; }
int wylosuj( int wylosowane[], int wylosowanych ) { do { int los =( rand() % 3 ) + 0; if( czyBylaWyl( wylosowane, wylosowanych, los ) == false ) { wylosowane[ wylosowanych ] = los; wylosowanych++; } } while( wylosowanych < 3 ); }
bool czyBylaw( int liczba, int wpisanych, int tab_wp[] ) { int i = 0; if( wpisanych <= 0 ) return false; do { if( tab_wp[ i ] == liczba ) { cout << "liczba " << liczba << " znajduje sie juz w tablicy" << endl; return true; } i++; } while( i < wpisanych ); return false; }
int wpisz_wp( int tab_wp[], int wpisanych ) { bool sukces; int liczba; do { do { cin >> liczba; sukces = cin.good(); cin.clear(); cin.sync(); } while( sukces == 0 ); if( czyBylaw( liczba, wpisanych, tab_wp ) == false ) { tab_wp[ wpisanych ] = liczba; wpisanych++; } } while( wpisanych < 3 ); }
int main() { srand( time( NULL ) ); int wpisane[ 3 ]; int wpisanych = 0; int wylosowane[ 2 ]; int wylosowanych = 0; cout << "podaj mi 3 liczby a wylosuje 2 z nich ;)" << endl; wpisz_wp( wpisane, wpisanych ); wylosuj( wylosowane, wylosowanych ); wpisanych = 0; cout << "\n\n"; do { cout << wpisane[ wpisanych ] << endl; wpisanych++; } while( wpisanych < 3 ); wylosowanych = 0; cout << "\n\n"; do { cout << wpisane[ wylosowane[ wylosowanych ] ] << endl; wylosowanych++; } while( wylosowanych < 2 ); return 0; }
pierwszą liczbę zmienia mi na 1 max 2 ;/ co do starego tam miało być przy jest równe (==) true ale i tak nie działa i wypisuje losowo, miałem też na celu aby nie ograniczać użytkownika zbytnio przed wyborem liczb ;D |
|
mateczek |
» 2016-12-19 18:38:53 trochę połatany kod. #include <iostream> #include <ctime> using namespace std;
bool czyByla( int tab_wp[], int index, int liczba ) { for( int i = 0; i < index; i++ ) { if( tab_wp[ i ] == liczba ) return true; } return false; }
void wylosuj( int wylosowane[], int wpisane[] ) { int wylosowanych = 0; while( wylosowanych < 2 ) { int los_index =( rand() % 3 ) + 0; if( czyByla( wylosowane, wylosowanych, los_index ) == false ) { wylosowane[ wylosowanych ] = los_index; wylosowanych++; } } for( int i = 0; i < 2; i++ ) { wylosowane[ i ] = wpisane[ wylosowane[ i ] ]; } }
void wpisz_wp( int tab_wp[] ) { bool sukces; int liczba; int wpisanych = 0; do { do { cin >> liczba; sukces = cin.good(); cin.clear(); cin.sync(); } while( sukces == 0 ); if( czyByla( tab_wp, wpisanych, liczba ) == false ) { tab_wp[ wpisanych ] = liczba; wpisanych++; } } while( wpisanych < 3 ); }
int main() { srand( time( NULL ) ); int wpisane[ 3 ] = { 0 }; int wpisanych = 0; int wylosowane[ 2 ]; int wylosowanych = 0; cout << "podaj mi 3 liczby a wylosuje 2 z nich ;)" << endl; wpisz_wp( wpisane ); wylosuj( wylosowane, wpisane ); wpisanych = 0; cout << "\n\n"; do { cout << wpisane[ wpisanych ] << endl; wpisanych++; } while( wpisanych < 3 ); wylosowanych = 0; cout << "\n\n"; do { cout << wylosowane[ wylosowanych ] << endl; wylosowanych++; } while( wylosowanych < 2 ); return 0; } |
|
czaffik |
» 2016-12-19 18:41:13 No teraz działa sensownie. |
|
mateczek |
» 2016-12-19 18:45:31 // a teraz na skróty #include <iostream> #include <ctime> #include<vector> using namespace std; int main() { srand( time( NULL ) ); vector < int > pula = { 1, 5, 3, 7, 8 }; for( int i = 0; i < 3; i++ ) { int losIndex = rand() % pula.size(); cout << pula[ losIndex ] << " "; pula.erase( pula.begin() + losIndex ); } }
|
|
kirito1996 Temat założony przez niniejszego użytkownika |
» 2016-12-19 21:12:08 najs będzie co analizować ;DD |
|
carlosmay |
» 2016-12-19 21:33:52 #include <iostream> #include <chrono> #include <random> #include <vector> #include <algorithm>
int main() { std::vector < int > myNumbers { 1, 2, 3, 4, 5, 6, 7, 8 }; std::shuffle( myNumbers.begin(), myNumbers.end(), std::default_random_engine( std::chrono::system_clock::now().time_since_epoch().count() ) ); std::size_t howManyNumsRand { 4 }; if( howManyNumsRand <= myNumbers.size() ) { for( std::size_t i { }; i < howManyNumsRand; ++i ) { std::cout << myNumbers[ i ] << ' '; } } } |
|
« 1 » 2 |