Wyswietlanie liczb tablicy

0

Witam,
Napisałem krótki program w c++, który losuje liczby bez powtórzeń, wpisuje je do tablicy i sortuje. Problem pojawia się przy wyświetlaniu liczb.Otóż im większe i w pętli for (gdy wypełnia tablice ) tym rzadziej wyświetla się tablica. Dla i==1 praktycznie zawsze się wyświetla, dla i==10 mniej więcej co drugi raz, a dla i==20 nigdy... Dlaczego tak się dzieje? Czym jest to spowodowane?

#include <iostream>
#include <conio.h>
#include <ctime>
#include <cstdlib>

int los, i, k, j;
//int t_multi_komp[20]  = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int t_multi_komp[20];

using namespace std;
int main()
{

    srand(time(NULL)); // Generator liczb losowych
    los = rand() % 79 + 1; // 79 - zakres liczb losowych
    t_multi_komp[0] = los; // wartość komórki 0, bo później musi do czegoś porównywać

    // ******** pozostała część tablicy *******

    for (i = 1; i < 10; i++) // wypełnianie dalszej części tablicy od komórki 1 // PROBLEMY Z WYSWIETLANIEM
    { // IM WIEKSZE i TYM RZADZIEJ TABLICA SIE WYSWIETLA
        // docelowe i==20
        los = rand() % 79 + 1;

        for (k = 0; k < i; k++) // sprawdzanie możliwych powtórzeń
        { // do tej pory wpisanych dlatego k<i
            if (t_multi_komp[k] == los)
                k--; // przy powtórce cofnij licznik
            else
                t_multi_komp[i] = los;
        }
    }

    for (i = 0; i < 20; i++)
        for (j = 1; j < 20 - i; j++) //pętla wewnętrzna
            if (t_multi_komp[j - 1] > t_multi_komp[j]) //zamiana miejscami
                swap(t_multi_komp[j - 1], t_multi_komp[j]);

    cout << "\n\n\t\t\t Liczby komputera \n\n";
    for (i = 0; i < 20; i++) {
        if (i == 10)
            cout << "\n";
        cout << " " << t_multi_komp[i] << "\t\a";
    }
    getch();
    return 0;
}

0

Cześć,
Po pierwsze do generowania liczb losowych w c++ masz już coś innego niż srand(). Także:

*Zapoznaj się z c++11 i generatorem liczb pseudolosowych

*Używaj vector zamiast zwykłych tablic ale jak już uparłeś się na tablice to chociaż std::array

*Zapoznaj się z pętlą for w c++(for each powiedzmy)

*Możesz też obczaić http://en.cppreference.com/w/cpp/algorithm/random_shuffle

*Zapoznaj się z algorytmami std::find.

0
        for (k = 0; k < i; k++) // sprawdzanie możliwych powtórzeń
        { // do tej pory wpisanych dlatego k<i
            if (t_multi_komp[k] == los)
                k--; // przy powtórce cofnij licznik
            else
                t_multi_komp[i] = los;
        }

Powiedzmy, że k = 4, i warunek t_multi_komp[k] == los jest prawdziwy.
k = 4 ⟶ if(...) ⟶ k = 3
inkrementujemy k
k = 4 ⟶ if(...) ⟶ k = 3
inkrementujemy k
k = 4 ⟶ if(...) ⟶ k = 3

i tak dalej.

Tutaj masz poglądowy program, który robi to co chciałeś (chyba):

int main()
{
    vector<int> numbers(80);
    mt19937 gen{random_device{}()};

    iota(numbers.begin(), numbers.end(), 1);

    shuffle(numbers.begin(), numbers.end(), gen);

    vector<int> results(10);
    copy_n(numbers.begin(), 10, results.begin());

    DBG_CONT(results);

    sort(results.begin(), results.end());

    DBG_CONT(results);
}

https://wandbox.org/permlink/ZNsiwdujQLdLa27H

0

Dzięki za odpowiedzi, (programuje niecałe 1,5 roku w liceum i stad ten przestarzały dla was język).

1 użytkowników online, w tym zalogowanych: 0, gości: 1