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

losowanie bez powtórzeń

Ostatnio zmodyfikowano 2016-12-30 15:46
Autor Wiadomość
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.



C/C++
#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[] /*wylosowane*/, int tab_wp[] /*wpisane*/ )
{
    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;
}
P-155187
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.
P-155188
kirito1996
Temat założony przez niniejszego użytkownika
» 2016-12-19 18:07:15
aha no spoko to teraz mam tak
C/C++
#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 )
        {
            //cout << "ok true";
            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
P-155189
mateczek
» 2016-12-19 18:38:53
trochę połatany kod.

C/C++
#include <iostream>
#include <ctime>
using namespace std;

//funkcja czy była wystarczy jedna
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; //zapis indexu
            wylosowanych++;
        }
       
    }
    //podmianka index na wartość z tablicy wpisane
    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;
}
P-155191
czaffik
» 2016-12-19 18:41:13
No teraz działa sensownie.
P-155192
mateczek
» 2016-12-19 18:45:31
// a teraz na skróty
C/C++
#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 ); // wylosowany element usuwam z puli !!!
    }
}
P-155193
kirito1996
Temat założony przez niniejszego użytkownika
» 2016-12-19 21:12:08
najs będzie co analizować ;DD
P-155199
carlosmay
» 2016-12-19 21:33:52
C/C++
#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 ] << ' ';
        }
    }
}
P-155200
« 1 » 2
  Strona 1 z 2 Następna strona