sadlawyer Temat założony przez niniejszego użytkownika |
losowanie bez powtórzeń » 2011-02-27 14:00:30 Od paru dni męczę się z zadaniem i wiem, że jestem, co raz bliżej, ale jednego mi brakuje. Zacząłem od tego, że wprowadziłem liczby do tablicy, a program miał losować ich indeksy bez powtórzeń, aby potem wywołać je na ekranie i ostatecznie uzyskać efekt wylosowania czterech z pięciu liczb wprowadzonych do programu. Tutaj mam kod: #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
bool sprawdz( int numer, int ile ) { int wyniki[ 4 ]; int i = 0; if( numer != wyniki[ i ] ) return true; do { if( numer == wyniki[ i ] ) return false; i++; } while( i < 3 ); return false; } int wylosuj() { return( rand() % 5 ); } int main() { srand( time( 0 ) ); int tablica[ 5 ]; cout << "Wprowadz piec liczb:" << endl; cin >> tablica[ 0 ]; cin >> tablica[ 1 ]; cin >> tablica[ 2 ]; cin >> tablica[ 3 ]; cin >> tablica[ 4 ]; int i = 0; int liczba; int wylosowanych = 0; do { liczba = wylosuj(); if( sprawdz( liczba, wylosowanych ) == true ) { cout << "Wylosowane to " << tablica[ liczba ] << endl; wylosowanych++; } } while( wylosowanych < 4 ); return 0; }
Indeksy losują się świetnie, tylko, że powtarzają się :/. Mógłby mi ktoś krok po kroku wytłumaczyć jak zrobić tą funkcję, która sprawdza czy liczba była w tablicy. Nie potrafię uzyskać tego efektu. Czytałem kurs milion razy i nawet to sobie rozpisałem, ale nie łapie. |
|
pekfos |
» 2011-02-27 14:51:31 const int n = 10; int tab[ n ]; int tmp; bool is; void randomize() { for( int a = 0; a < n; a++ ) { is = false; tmp = rand() % n; for( int t = 0; t < a; t++ ) { if( tab[ t ] == tmp ) { is = true; break; } } if( !is ) tab[ a ] = tmp; else { a--; continue; } } } chodzi ci o ten efekt? |
|
neke |
» 2011-02-27 15:09:16 Tablica, którą zadeklarowałeś w pierwszej funkcji jest czyszczona za każdym razem gdy ją opuszczasz. Zobacz jeden z moich ostatnich postów. |
|
sadlawyer Temat założony przez niniejszego użytkownika |
» 2011-02-27 15:35:15 pekfos niezły żart... neke tak tak, tylko, że w tamtym losowaniu liczb z tablicy nie ma nic o robieniu bez powtórzeń. losuje tylko 3 wprowadzone liczby, a ja chce, żeby wylosowane się nie powtarzały. |
|
ison |
» 2011-02-27 16:20:50 można też z STLa skorzystać: #include <cstdio> #include <vector> #include <ctime> #include <cstdlib> #include <algorithm>
int main() { srand( time( NULL ) ); std::vector < int > vec; for( int i = 0, tmp; i < 5; ++i ) { scanf( "%d", & tmp ); vec.push_back( tmp ); } random_shuffle( vec.begin(), vec.end() ); for( size_t i = 0; i < vec.size(); ++i ) { printf( "%d ", vec[ i ] ); } }
|
|
neke |
» 2011-02-27 17:06:31 see to http://cpp0x.pl/forum/temat/?id=3757 Tak w temacie ;)
|
|
sadlawyer Temat założony przez niniejszego użytkownika |
» 2011-02-27 19:17:07 sry, nie zauważyłem tego tematu, ale i tak wiele mi to nie pomogło. wciąż nie czaję tego sprawdzania czy była w funkcji ;/. wiem teraz, że tablica wpisana tam się czyści, ale i tak nie wiem, co robić dalej z tym kodem. |
|
malan |
» 2011-02-27 19:51:38 Zapomnij o static . To jest tu naprawdę zbędne ;p. Skompiluj sobie: #include <ctime> #include <iostream>
const int ARRAY_SIZE = 10;
bool isInArray( int array[], int size, int value ) { std::cout << "Sprawdzam, czy liczba " << value << " jest w tablicy..." << std::endl; for( int i = 0; i < size; ++i ) { if( array[ i ] == value ) { std::cout << "Liczba " << value << " jest juz w tablicy! Zwracam TRUE." << std::endl; return true; } } std::cout << "Liczby " << value << " nie ma w tablicy!" << std::endl; return false; }
int main() { int array[ ARRAY_SIZE ]; int temp = 0; srand( time( 0 ) ); for( int i = 0; i < ARRAY_SIZE; ++i ) { do { temp = rand() % 15 + 0; } while( isInArray( array, i, temp ) ); array[ i ] = temp; } std::cout << std::endl << "Wylosowane liczby: " << std::endl; for( int i = 0; i < ARRAY_SIZE; ++i ) std::cout << array[ i ] << std::endl; } |
|
« 1 » 2 |