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

Generowanie liczb pseudolosowych z wzynaczonego zakresu.

Ostatnio zmodyfikowano 2017-12-10 20:57
Autor Wiadomość
dartpizza88
Temat założony przez niniejszego użytkownika
Generowanie liczb pseudolosowych z wzynaczonego zakresu.
» 2017-12-10 13:52:00
Cześć, mam napisać program z funkcją, która będzie umożliwiała generowanie (bez powtórzeń) i zapisywanie do tablicy dynamicznej liczb pseudolosowych. Udało mi się coś stworzyć ale nie do końca działa to tak jakbym chciał, czasami program wychodzi poza przedział i po wypisaniu liczb pojawia się tam zbyt dużo ich, a konkretnie te co miał wypisać + ta cyfra ile ich miało być.
Oto kod programu
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int losowanie( int p, int k, int z );

int main()
{
    int p;
    int k;
    int z;
    cout << "podaj poczatek" << endl;
    cin >> p;
    cout << "podaj koniec" << endl;
    cin >> k;
    cout << "podaj ilosc elementow w tablicy" << endl;
    cin >> z;
    cout << "Wylosowane liczby to:";
    cout << losowanie( p, k, z );
   
    return 0;
}

losowanie( int p, int k, int z )
{
    srand( time( 0 ) );
    int * tab = new int[ z ];
    for( int i = 0; i < z; i++ )
    {
        tab[ i ] =( rand() % k ) + p;
        for( int j = 0; j < z; j++ )
        {
            if( tab[ i ] == tab[ j ] )
            {
                tab[ i ] =( rand() % k ) + p;
            }
           
        }
        cout << tab[ i ] << " ";
    }
   
}
P-167767
Luq
» 2017-12-10 15:21:43
Funkcja losowanie deklaruje, że zwraca wartość int, ale w kodzie tego nie robi (brak return). Jeśli ma nic nie zwracać, to powinna być void.

tab[ i ] =( rand() % k ) + p;
To wyrażenie nie losuje liczby z przedziału [p, k].

Twój algorytm sprawdzania czy wylosowana liczba się powtarza też jest błędny.
P-167771
dartpizza88
Temat założony przez niniejszego użytkownika
» 2017-12-10 17:46:37
Jeśli chodzi o przedział to zamieniłem na coś takiego
tab[ i ] =( rand() %( k - p + 1 ) );
 ale nadal nie wiem jak ograniczyć ten przedział od dołu. Co do zwracania teraz ilość cyfr zwracanych się zgadza, zmieniłem typ na void. Przeglądałem różne sposoby jeśli chodzi o brak powtórzeń ale nadal nie do końca wiem jak to zrobić.
P-167777
mateczek
» 2017-12-10 20:57:59
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int * losowanie( int p, int k, int z );

int main()
{
    int p;
    int k;
    int z;
    cout << "podaj poczatek" << endl;
    cin >> p;
    cout << "podaj koniec" << endl;
    cin >> k;
    cout << "podaj ilosc elementow w tablicy" << endl;
    cin >> z;
    cout << "Wylosowane liczby to:";
    int * tab = losowanie( p, k, z );
    for( int i = 0; i < z; i++ ) {
        cout << tab[ i ] << " ";
    }
    delete[] tab;
    return 0;
}

int * losowanie( int p, int k, int z )
{
    srand( time( 0 ) );
    int * tab = new int[ z ];
    for( int i = 0; i < z; )
    {
        tab[ i ] =( rand() %( k - p + 1 ) ) + p;
        bool byla = false;
        for( int j = 0; j < i; j++ )
        {
           
            if( tab[ i ] == tab[ j ] )
            {
                byla = true;
                break;
            }
           
        }
        if( byla == false ) {
            i++;
        }
    }
    return tab;
}
P-167785
« 1 »
  Strona 1 z 1