losowanie liczb i zapisywanie ich do zmiennych

2011-09-25 16:45
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

edytowany 2x, ostatnio: madmike, 2011-09-26 19:11

Pozostało 580 znaków

2011-09-25 17:03
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


non omnis moriar i tyle :-)
edytowany 1x, ostatnio: arasso12, 2011-09-25 17:05

Pozostało 580 znaków

2011-09-25 17:56
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;
}

edytowany 3x, ostatnio: hauleth, 2011-09-25 19:11

Pozostało 580 znaków

2011-09-25 18:27
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

Pozostało 580 znaków

2011-09-25 18:35
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ę.


"(...) otherwise, the behavior is undefined".
A co to za różnica? U mnie od razu widać jaki będzie zwracany typ bo może ktoś by chciał na longach. - hauleth 2011-09-25 18:39
No taka, że bez tego się nie kompiluje na kompilatorach zgodnych ze standardem. uniform_int_distribution ma domyślny parametr szablonu int ale i tak trzeba użyć <>. To po prostu błąd składni. (std 14.3.4) - Endrju 2011-09-25 19:00
Wiem, myślałem, że dodałem bo testowałem na ideone i tam poprawiłem, ale tu zapomniałem. - hauleth 2011-09-25 19:07

Pozostało 580 znaków

2011-09-25 18:58
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.

edytowany 4x, ostatnio: hauleth, 2011-09-25 19:13

Pozostało 580 znaków

2011-09-26 13:23
arasso12

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

Pozostało 580 znaków

2011-09-26 15:53
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Nie, nie jest. Tamto nie ma nic wspólnego z C++. Uczenie się języka od początku źle nie ma sensu. - Endrju 2011-09-26 16:57
Weź pod uwagę, że większość ludzi szuka w googlach przed zadaniem pytania, więc wg mnie odpowiedzi powinny być jak najbardziej kompletne. - Zjarek 2011-09-26 19:01

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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