Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

losowanie bez powtórzeń

Ostatnio zmodyfikowano 2011-02-27 20:00
Autor Wiadomość
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:
C/C++
#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.
P-28653
pekfos
» 2011-02-27 14:51:31
C/C++
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?
P-28654
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.
P-28656
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.
P-28658
ison
» 2011-02-27 16:20:50
można też z STLa skorzystać:
C/C++
#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 ] );
    }
}
P-28660
neke
» 2011-02-27 17:06:31
see to
http://cpp0x.pl/forum/temat/?id=3757
Tak w temacie ;)
P-28662
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.
P-28669
malan
» 2011-02-27 19:51:38
Zapomnij o
static
. To jest tu naprawdę zbędne ;p.
Skompiluj sobie:
C/C++
#include <ctime>
#include <iostream>

const int ARRAY_SIZE = 10; // Rozmiar tablicy zawierającej liczby...

// Funkcja sprawdzająca, czy liczba jest już w tablicy...
// Argumenty:
// *array - tablica (typu int) z wylosowanymi liczbami.
// *size  - rozmiar przeszukiwanej tablicy.
// *value - wartość, której szukamy w tablicy array.
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 )
    {
        // Jeżeli liczba w tablicy jest równa wartości, której szukamy, zwróć true, czyli powiedz: "Tak! Taka liczba już jest w tablicy!"
        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; // Wylosuj wartość z przedziału (0 ; 15)...
        } while( isInArray( array, i, temp ) ); // Losuj liczbę dopóki nie znajdziesz takiej, której NIE ma jeszcze w tablicy...
       
        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;
   
}
P-28673
« 1 » 2
  Strona 1 z 2 Następna strona