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

[Lekcja 21] Losowanie bez powtórzeń

Ostatnio zmodyfikowano 2013-02-23 20:57
Autor Wiadomość
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.

C/C++
#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.
P-76721
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.
P-76735
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?

P-76830
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 :)
P-76838
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.
P-76840
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.
P-76843
usmiech
» 2013-02-23 20:04:35
Oki .. kawalek kodu :)
C/C++
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 )
    // itd :)
   
P-76844
usmiech
» 2013-02-23 20:46:50
A to kawalek drugiego kodu :)

C/C++
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;
}
P-76847
« 1 » 2
  Strona 1 z 2 Następna strona