losowanie liczb i zapisywanie ich do zmiennych

0

Witam. Chciałbym napisać program, które przyjmuje jedną liczbę, a wypisuje w nowych linijkach tyle losowych liczb ile wskazywała liczba, którą wpisaliśmy na początku. Chcę także zaznaczyć, że każdą wylosowaną liczbę chciałbym zapisać do nowych zmiennych. Czy tak się da?
Próbowałem już coś napisać, lecz przez cały czas wypisuje te same liczby i nie zapisuje ich do nowych zmiennych, tylko zwyczajnie wypisuje.


#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void main(){
    int liczba1, liczba;
    cin>>liczba1;
    cout<<endl;

    for(int i= 0; i < liczba1; i++){

    srand( (unsigned)time( NULL ) );
    liczba = rand() % 10 + 1;
    cout<<liczba<<endl;
    }
    system("PAUSE");
}

Pozdrawiam

1
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main()
{
    int tablicaliczb[100]; //zakladam ze nie bedziesz losowal wiecej niz 100liczb, jezeli nie rozumiesz - poczytaj o tablicach
    int liczba;
    cin>>liczba;
    srand(time(NULL));  //odpalam generator liczb losowych
    for(int t=0; t<liczba; t++)
    {
        tablicaliczb[t]=(rand()%10)+1;  //zapisuje wylosowana liczbe do tablicy pod indexem t
        cout<<tablicaliczb[t]<<endl; //wypisuje element tablicy o indexie t(wczesniej wylosowana i zapisana liczbe)
    }

    return 0;
}

Poczatki sa ciezkie, powodzenia :P

2

Wersja bardziej hardcorowa:

#include <iostream>
#include <vector>
#include <random>
#include <functional>
#include <ctime>

int main() {
    std::vector<int> tablica_liczb; // 1
    std::mt19937 silnik(static_cast<int>(time(nullptr))); // 2
    std::uniform_int_distribution<int> rozklad(0, 100); // 3
    auto losuj = std::bind(rozklad, silnik); // 4
    int rozmiar;
    std::cin >> rozmiar;
    tablica_liczb.resize(rozmiar); // 5
    for(int& liczba : tablica_liczb) { // 6
        liczba = losuj(); // 7
        std::cout << liczba;
    }
    return 0;
}
0

@winerfresh Zrozumiałem tylko jakieś 3/4 z tego co napisałeś. Początek jest dla mnie niezbyt jasny (to chyba są wskaźniki, czy coś i jakaś dziwna definicja tablicy).
@arasso12 Tutaj jest wszystko jasne. Też myślałem żeby tak zrobić, tylko że zakres liczb nie wynosi 100, tylko 100000 :( (może i mógłbym ową tablicę zadeklarować, lecz zawierałaby za dużo miejsca.
Pozdrawiam

0
winerfresh napisał(a)

Wersja bardziej hardcorowa:

Tam od razu hc, tak powinno właśnie być w C++. :-) Jedna uwaga:

std::uniform_int_distribution<> rozklad(0, 100);

@up jeżeli chcesz pisać w C++ lepiej rozgryź tę hardkorową wersję.

1
compl napisał(a)

@winerfresh Zrozumiałem tylko jakieś 3/4 z tego co napisałeś. Początek jest dla mnie niezbyt jasny (to chyba są wskaźniki, czy coś i jakaś dziwna definicja tablicy).
@arasso12 Tutaj jest wszystko jasne. Też myślałem żeby tak zrobić, tylko że zakres liczb nie wynosi 100, tylko 100000 :( (może i mógłbym ową tablicę zadeklarować, lecz zawierałaby za dużo miejsca.
Pozdrawiam

Już tłumaczę:

#include <iostream>
#include <vector>
#include <random>
#include <functional>
#include <ctime>

int main() {
    std::vector<int> tablica_liczb; // 1
    std::mt19937 silnik(static_cast<int>(time(nullptr))); // 2
    std::uniform_int_distribution<int> rozklad(0, 100); // 3
    auto losuj = std::bind(rozklad, silnik); // 4
    int rozmiar;
    std::cin >> rozmiar;
    tablica_liczb.resize(rozmiar); // 5
    for(int& liczba: tablica_liczb) { // 6
        liczba = losuj(); // 7
        std::cout << liczba;
    }
    return 0;
}

A mianowicie:

  1. Tutaj deklarujemy wektor zawierający inty. Wektor to jest dynamiczna struktura danych zawarta w bibliotece STL i jest nota bene dynamiczną tablicą tylko, opakowaną w wiele przydatnych funkcji oraz pozwalającą na łatwą pracę z biblioteką algorithm, która zawiera wiele prostych, przydatnych i często wykorzystywanych funkcji jak sortowanie czy wyszukiwanie.
  2. Tworzymy instancję silnika liczb pseudolosowych i zasiewamy ją aktualnym czasem w sekundach od Ery Uniksa. W tym przypadku jest to Mersenne Twister, który jest dość dobry do generowania liczb pseudolosowych w cywilnych zastosowaniach.
  3. Wybieramy odpowiedni rozkład liczb losowych. W tym przypadku jest to najzwyklejszy rozkład jednostajny dyskretny o zakresie [0, 100).
  4. std::bind() to funkcja pozwalająca połączyć funkcję z jej argumentami, a w wyniku dać funkcję z ograniczoną liczbą argumentów. Jeśli byśmy tego nie zrobili musielibyśmy wywoływać po prostu rozklad(silnik). auto to jest nowa konstrukcja (nie słowo kluczowe, które już było, ale został zmieniony sens tego słowa), która sama automatycznie określa typ zmiennej w czasie kompilacji na podstawie wartości przypisanej w momencie tworzenia.
  5. Ustalamy rozmiar wektora na rozmiar, czyli de facto tworzymy tablicę dynamiczną o rozmiarze rozmiar.
  6. Pętla for oparta na zakresie. To samo co
    for(auto i = tablica_liczb.begin(); i != tablica_liczb.end(); ++i) {
    int& liczba = *i;
    // ciało pętli
    }
  7. Losujemy korzystając ze zbindowanej funkcji (patrz punkt 4.).
    Mam nadzieję, że dość obszernie to wytłumaczyłem.
0

Jezeli trzeba Ci tak duza tablice to trzeba wskaznik
int* tab=new int[ilosc];

pozniej delete []tab;

tak wynika z mojej wiedzy, powyzszych przyklaadow tez nie ogarniam, moze jak siade na PC obczaje bo pisze z fona ;p

1

Ludzie to jest początkujący.
Zaczyna "gotować" i prosił was o zwykłą jajecznice, a wy mu dajecie "omlette du fromage".
Fajne jako dygresja, ale wyście zrobili z tego wątek główny. Wątek powinien się zakończyć po pierwszej odpowiedzi, bo tyle początkującemu jest potrzebne.

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