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

Losowanie bez powtorzen.

Ostatnio zmodyfikowano 2015-11-16 12:51
Autor Wiadomość
bojo240
Temat założony przez niniejszego użytkownika
Losowanie bez powtorzen.
» 2015-11-11 23:58:18
Witam.
Jako, że jestem trochę na bakier z funkcjami oraz przekazywaniem tablic do funkcji mam zwyczaj robienia najpierw zadania bez funkcji, a nastepnie 'pakowania go w funkcje', stad prosze o wyrozumiałość.
Otóż natchnęło mnie na zrobienie zadania z rozdziału 21, tj losowanie bez powtórzeń.
Zadanie polega na napisaniu programu który losuje 5 liczb z przedziału od 1-10 bez powtórzeń.
Obecnie udało mi się co nieco stworzyć, ale brakuje mi zapewne jednej poprawki aby program faktycznie działał, ponieważ obecnie i owszem wyswietla 5 liczb z przedzialu 1-10, jednakże nie bardzo idzie mu sprawdzanie czy wczesniej byla wylosowana..;s.
Mój obecny kod:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
    srand( time( 0 ) );
    int i = 5;
    int a[ i ];
    int x = 0;
    i = 0;
    while( i < 5 ) //petla do generowania kolejnych liczb
    {
        a[ i ] =( rand() % 10 ) + 1; //losowanie liczby
        while( x == i ) //petla sprawdzajaca czy liczba nie zostala juz wylosowana
        {
            if( a[ i ] == a[ i - x ] )
            {
                a[ i ] =( rand() % 10 ) + 1;
            } //jezeli liczba zostala juz wylosowana, losuj ponownie
            x++; //zwiekszam roznice, aby sprawdzil dla 5 i 3, 5 i 2 etc..
        }
        x = 0;
        cout << a[ i ] << endl; //wyswietl liczbe
        i++;
    }
    return 0;
}
Prosiłbym o nakierowanie na problem.
P-140010
michal11
» 2015-11-12 00:34:59
W twoim programie po sprawdzeniu powiedzmy pierwszych 2 liczb, gdy okaże się, że 3 liczba w tablicy jest równa wylosowanej losujesz na nowo ale nie sprawdzasz czy ta nowa wylosowana liczba nie występuje wcześniej (na pozycji 0, 1) w tablicy. Myślę, że jak zmienisz pętle z while na for to trochę to uprości zrozumienie ci problemu i napisanie poprawnego algorytmu.
P-140014
bojo240
Temat założony przez niniejszego użytkownika
» 2015-11-15 19:01:03
Szczerze powiedziawszy próbowałem wszystkimi petlami i na wszystkie sposoby i dalej nie idzie ;X
P-140181
bojo240
Temat założony przez niniejszego użytkownika
» 2015-11-15 19:15:33
Ahh, wybacz, dopiero po paru dniach zajarzyłem ocb, otóż zabrakło mi ponownego wyzerowania mojej 'roznicy'.

W razie czego mój nowy kod:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
    srand( time( 0 ) );
    int i = 5;
    int a[ i ];
    int x = 0; //liczba do operowania, aby sprawdzic czy liczba nie zostala juz wylosowana
    i = 0;
    while( i < 5 ) //petla do generowania kolejnych liczb
    {
        a[ i ] =( rand() % 10 ) + 1; //losowanie liczby
        while( x <= i ) //petla sprawdzajaca czy liczba nie zostala juz wylosowana
        {
            if( a[ i ] == a[ i - x ] ) //jezeli tak...
            {
                a[ i ] =( rand() % 10 ) + 1; //losuj ponownie...
                x = 0; //oraz wyzeruj roznice
            }
            x++; //a jezeli nie to zwieksz ja i zacznij od nowa dopoki x<=i
        }
       
        cout << a[ i ] << endl; //wyswietl liczbe
        i++;
        x = 0; //ponowne wyzerowanie roznicy
    }
    return 0;
}
Dziękuję ci bardzo za pomoc, michal11 ^^
P-140184
j23
» 2015-11-16 09:51:06
Tu wersja STL:
C/C++
std::array < int, 10 > tab = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

std::random_shuffle( tab.begin(), tab.end() );

for( int i = 0; i < 5; ++i ) std::cout << tab[ i ] << '\n';



C/C++
int i = 5;
int a[ i ];
Jeśli C++, to tak:
C/C++
const int i = 5;
int a[ i ];
P-140202
Monika90
» 2015-11-16 12:51:29
std::random_shuffle jest deprecated i będzie usunięte z C++17 (jest zamiennik czyli std::shuffle). Na dodatek, (random_)shuffle robi więcej niż potrzeba by wylosować 5 liczb z 10.
P-140206
« 1 »
  Strona 1 z 1