Wypełnienie tablicy o podanym wymiarze losowymi liczbami z zadanego przedziału

0

Witam.
Jestem nowy w programowaniu. Walczę z zadaniem ze szkoły.
Muszę napisać program, który za pomocą algorytmu sortowania bąbelkowego (samodzielna implementacja) sortuje losowo wygenerowane liczby całkowite od najmniejszej do największej i wypisuje je tak uporządkowane w konsoli oddzielone przecinkami, po 15 w linijce. Ilość liczb do posortowania oraz przedział z jakiego je losujemy podaje użytkownik.

Zatrzymałem się w momencie, kiedy wybrałem już generator liczb (mt19937 gen(rd());) oraz ustaliłem zakres losowania (uniform_int_distribution<> dis(min, max)) oraz zainicjowałem tablicę.
Nie potrafię wpisać wylosowanych liczb do tablicy.

Bez tablicy kod działa dobrze wypisując mi liczby, ale tablica mnie rozwaliła.
Proszę o wskazówki, co mam zrobić dalej.

Na razie mam tyle:

#include <iostream>
#include <random>
#include <ctime>

using namespace std;

int main() {
    srand ( time(0) );
    	
    int min, max, ilosc;
    cout<<"Wpisz liczbe bedaca dolnym zakresem przedzialu, z ktorego beda losowane liczby: ";
    cin>>min;
    cout<<"Wpisz liczbe bedaca gornym zakresem przedzialu, z ktorego beda losowane liczby: ";
    cin>>max;
    cout<<"Ustal ile liczb ma byc wylosowanych z ustalonego przedzialu: ";
    cin>>ilosc;
    
    // wybor generatora liczb
    random_device rd;
    mt19937 gen(rd());

    // okreslenie zakresu losowania min i max
    uniform_int_distribution<> dis(min, max);
 
    int *tablica = new int[ilosc];
    
    // wypelnienie tablicy liczbami ???
    for (int i=0; i<ilosc; i++);
	{ 
	   
	}
	
    // wydrukowanie tablicy nieposortowanej
    for (int i=0; i<ilosc; i++)
    {
    cout << tablica[i] << " ";
    }

    // sortowanie babelkowe
    
    ...
    // wydrukowanie liczb posortowanych w tabeli oddzielonych przecinkami, po 15 w linijce
    ...
}
1

Nie umiesz tak zrobić array[i] = randomValue ?

0

Ale muszę mieć liczby z przedziału zadeklarowanego od ... do .... przez użytkownika.
Czy nie jest tak, że jak wybiorę zwykły generator liczb losowych, to ten przedział deklarowany nie będzie brany pod uwagę?

0

Zatrzymałem się w momencie, kiedy wybrałem już generator liczb (mt19937 gen(rd());) oraz ustaliłem zakres losowania (uniform_int_distribution<> dis(min, max)) oraz zainicjowałem tablicę.
Nie potrafię wpisać wylosowanych liczb do tablicy.

No to albo nie potrafisz wpisać wylosowanych liczb albo nie potrafisz ich wylosować.

Czy nie jest tak, że jak wybiorę zwykły generator liczb losowych, to ten przedział deklarowany nie będzie brany pod uwagę?

Co to jest zwykły generator? Przecież możesz użyć tego mt19973 jak chcesz. Masz tutaj przykład: https://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution
Zresztą są też sposoby na to żeby "zwykłym" generatorem dostać liczbę z zadanego przedziału.

0

Jeśli słabo się wysławiam w języku programisów, to przepraszam. Tak jak napisałem jestem nowy, ale zależy mi, żeby się nauczyć.

Wydaje mi się, że wylosować i wydrukować je potrafię:

#include <iostream>
#include <random>

using namespace std;

int main() {
    int min, max, ilosc;
    cout<<"Wpisz liczbe bedaca dolnym zakresem przedzialu, z ktorego beda losowane liczby: ";
    cin>>min;
    cout<<"Wpisz liczbe bedaca gornym zakresem przedzialu, z ktorego beda losowane liczby: ";
    cin>>max;
    cout<<"Ustal ile liczb ma byc wylosowanych z ustalonego przedzialu: ";
    cin>>ilosc;
    
     // tworzenie generatora liczb losowych
    random_device rd;
    mt19937 gen(rd());

    // ustalanie zakresu od ... do ...
    uniform_int_distribution<> dis(min, max);

    // drukowanie zadeklarowanej ilosci liczb
    for (int i=0; i<ilosc; ++i)
    cout << dis(gen) << " ";
    
}

Wyżej wszystko działa.
Ale, żeby ruszyć dalej z sortowaniem bąbelkowym, to będę musiał wrzucić wylosowane liczby do tablicy, żeby je posortować. I wydawało mi się, że łatwiej będzie, jeśli liczby od razy będą drukowane w tablicy po wylosowaniu z przedziału.

0

No ale Ci już raz napisałem jak wrzucić do tablicy. Teraz w pętli wypisujesz cout<<dis(gen) a ja Ci napisałem żebyś zrobił array[i] = dis(gen) i będziesz miał je w tablicy.

0

Dziękuję za wskazówki. i cierpliwość do mnie
Mam nadzieję, że dobrze zrozumiałem, ale nadal robię jakiś błąd.

Zmodyfikowałem pętlę na coś takiego.

    // wypelnienie tablicy liczbami ???
    for (int i=0; i<ilosc; i++);
	{ 
	    tablica[ilosc] = dis(gen);
	}
	
    // wydrukowanie tablicy nieposortowanej
    for (int i=0; i<ilosc; i++)
    {
    cout << tablica[ilosc]  << " " ;
    }

Niestety generuje mi ciąg obranej ilości liczb, ale cały czas tą samą liczbę.

screenshot-20180621161437.png

Może jeszcze jakaś wskazówka co robię źle.

1

Panie! Nie tablica[ilosc] bo będziesz pisał poza tablicę, tylko tablica[i] gdzie i zmienia Ci się w pętli. Tak zresztą już pisałem 2 razy.

0

Ewidentnie nie rozumiem :/ ??? Próbuję na różne sposoby i nic mi nie wychodzi.

???
   // wypelnienie tablicy liczbami ???
    int *tablica = new int[ilosc];
    for (int i=0; i<ilosc; i++);
    { 
    tablica[i] = dis(gen);
    }
???

Nie wiem co robię źle? Zakładam, że sporo. Proszę o dalsze wskazówki.

0

Witam. Ponownie.
Dziękuję za wszystkie wskazówki.
Popracowałem trochę jeszcze nad moim zadaniem, pozmieniałem sporo. W sumie to mam jeden błąd pewny błąd w programie. Przy wyświetlaniu liczb po 15 w pierwszej linijce wyświetla mi 16 liczb, w pozostałych robi już dobrze. Prawdopodobnie w funkcji, którą mam nie uwzględniłem zerowego indeksu., ale nie mam pomysłu jak poprawić funkcję.
Może ktoś mi udzieli jakichś wskazówek. Może powinienem zupełnie zmienić tą funkcję?

Oto pełen kod:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

// ustalenie liczby stałej, która będzie wykorzystana do tworzenia tabeli w sortowaniu w main
const int TAB_SIZE = 1000;

//ustalenie metody losowania liczb pseudolosowych, ktora zostanie wykorzystana w main
int random(int x, int y)
{
static bool first = true;
if (first)
{
srand( time(NULL) );
first = false;
}
return x + rand() % (( y + 1 ) - x);
}

//ustalenie sortowania babelkowego, ktore bedzie wykorzystane w main
int *sort(int *tablica, int max) {
for (int i=0; i<=max; i++)
for (int j=0; j<max-1; j++)
if (tablica[j]>tablica[j+1])
swap(tablica[j], tablica[j+1]);

return tablica;

}

// uzycie funkcji void do ustalenie sposobu porzadkowania wszystkich wylosowanych liczb
// w wiersze o ustalanej w main ilości kolumn oraz ilości indeksów max ustalanej w main

int main() {
srand( time(NULL) );

int min, max, ilosc;
cout<<"Wpisz liczbe bedaca dolnym zakresem przedzialu, z ktorego beda losowane liczby: ";
cin>>min;
cout<<"Wpisz liczbe bedaca gornym zakresem przedzialu, z ktorego beda losowane liczby: ";
cin>>max;


if (max<=min)
{cout << "TWOJA DRUGA LICZBA NIE JEST WIEKSZA OD PIERWSZEJ. PROGRAM KONCZY DZIALANIE";
exit( 0 );
}
else 
{cout << endl;
}	


cout<<"Ustal ile liczb ma byc wylosowanych z ustalonego przedzialu: ";
cin>>ilosc;


 
cout << endl;
cout << "DRUKOWANIE TABLICY NIEPOSORTOWANEJ" << endl;
int tablica [ilosc] ;

// wypelnienie tablicy liczbami z wykorzystaniem random ustalonego wczesniej z zakresem wybranym przez uzytkownika
for (int i=0; i < ilosc; i++)
{ 
    tablica[i] = random(min, max);
    
     cout << tablica[i] << " ";
}
cout << endl;

	// sortowanie babelkowe z wykorzystaniem ustawionej przed main funkcji sortowania

cout << "SORTOWANIE" << endl;

int *tablica1 = sort(tablica, ilosc);
    for (int i = 0; i<ilosc; i++)
    cout << tablica1[i] << " ";
cout << endl;    

// wydrukowanie liczb posortowanych w tabeli oddzielonych przecinkami, po 15 w linijce z wykorzystaniem funkcji void sformatujLinie ustalonej przed main

cout << "DRUKOWANIE WYLOSOWANYCH LICZB W TABELI ODZIELONYCH PRZECINKAMI PO 15 W LINIJCE" << endl;


int linie = ilosc / 15;

if (linie == 0)
	linie ++;
	
int i = 0;
int j = 1;
while (true) {
	cout << tablica[i];

	
	if (i == ilosc-1)			       
		break;
	else if (i / j == 15){	          
		cout << "," << endl;       
		++j;
	} else						
		cout << ", ";
	
	++i;
}

}

1

Ale sobie utrudniasz.
https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/
https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/

// pobierz wartości
int min = get_min(), max = get_max();
size_t count = get_count();

// zainicjalizuj prng
std::mt19937 gen{std::random_device{}()};
std::uniform_int_distribution<int> dis{min, max};

// utwórz tablicę
std::vector<int> vec(count);
// uzupełnij losowymi
std::generate(vec.begin(), vec.end(), [&]{ return dis(gen); });

// wypisz
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, ", "));

https://wandbox.org/permlink/TiGONC6uq5Ufm2Di

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