Losowanie liczb pseudolosowych

Odpowiedz Nowy wątek
2018-01-25 19:27
0

Witam, mam takie zadanie żeby wylosować 1 000 000 liczb w zakresie 0 - 100 po czym program ma sobie wyświetlić najczęstszą wartość. Kiedy staram sie zmienić w pętli żeby wykonywała się do 1 000 000 razy to mi się crashuje i nie wiem gdzie robie błąd, może koncepcyjnie . Dziękuje za wszystkie podpowiedzi



#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>
using namespace std;
int main()
{
 const int N = 101;
 int Z[N],i,j,L,W,maxL,maxW;

// Generuje zawartość Z[]
 srand((unsigned)time(NULL));
 for(i = 0; i <= N; i++) Z[i] = rand() % 100+1;

// Wyszukuje najczęstszą wartość
 maxL = 0;
 for(i = 0; i < N; i++)
 {
 W = Z[i]; L = 0;
 for(j = 0; j <= N; j++) if(Z[j] == W) L++;
 if(L > maxL)
 {
 maxL = L; maxW = W;
 }
 }

cout<<"Najczesciej wylosowana wartoscia jest: "<<maxW<<endl<<"zostala wylosowana "<<maxL<<" razy"<<endl;

 system("pause");
return 0;
}

Pozostało 580 znaków

2018-01-25 19:30
0

Gdy masz tablicę n elementów to pierwszy element znajduję się pod indeksem 0 a ostatni pod indeksem n - 1. Co oznacza że ta pętla jest nieprawidłowa:

for (i = 0; i <= N; i++)
    Z[i] = rand() % 100 + 1;

i tak samo ta

for (j = 0; j <= N; j++)
    if (Z[j] == W)
        L++;

Pozostało 580 znaków

2018-01-25 20:09
0

Nie wiem czy to dobrze rozumiem ale wystarczy zwiększyć N o 1 i bedzie działać

Pozostało 580 znaków

2018-01-25 20:13
0

To jeszcze gorzej, n to rozmiar tablicy więc nie możesz ot tak go zmienić.

Miałem na myśli że te pętle powinny wyglądać tak:

for (int i = 0; i < N; i++) { ... }

Pozostało 580 znaków

2018-01-25 20:16
0
const int N = 101;

Źle zrozumiałeś. N jest stałe.

W pętlach zmienia się wartość zmiennej iteracyjnej.
http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Petla-for/294
http://en.cppreference.com/w/cpp/language/for

Kiedy staram sie zmienić w pętli żeby wykonywała się do 1 000 000 razy to mi się crashuje i nie wiem gdzie robie błąd

Przekraczasz rozmiar stosu: stack overflow.
Tablica nie mieści się na stosie. Możesz użyć tablicy dynamicznej (polecam std::vector), lub kombinować z rozmiarem stosu (nie polecam).

W zasadzie nie ma potrzeby tworzenia tak wielkiej tablicy.
Wystarczy tablica na 101 elementów. Wyzerować ją przed użyciem.
Losować wartość i inkrementować wartość komórki spod indeksu wylosowanej wartości.
Na koniec znaleźć indeks komórki o maksymalnej wartości.


Nie pisz na priv. Zadaj dobre pytanie na forum.
edytowany 4x, ostatnio: YooSy, 2018-01-25 20:27

Pozostało 580 znaków

2018-01-26 16:18
0

Zrobiłem to troszke inaczej tylko chyba nie działa mi sprawdzanie najczęstszej liczby:

#include <iostream>
#include <time.h>
#include <cstdlib>

using namespace std;

int main()
{
int i,los,roz_tab=100,najcz,najw,w,l;
int Liczby[roz_tab] = { 0 };
int IloscWys[roz_tab] = { 0 }; // stworzenie 101-elementowej tablicy wypełnionej zerami
srand((unsigned)time(NULL));

 for(i=0;i<=roz_tab;i++)
{ 

Liczby[i]=i;

}

for(i=0;i<=1000000;i++) // losuje
{ 
    los=rand()%101;

            for(int j=0; j<=100;j++) // sprawdza ile razy liczba została wylosowana
        {
        if(los == Liczby[j]){ IloscWys[j]++; }
        }

}
        for(int k=0; k<=100;k++) //sprawdza najczęstszą
        {
        w=IloscWys[1];
        int wn=IloscWys[k];
        l=Liczby[1];
        int ln=Liczby[k];

        if(w>wn) { najcz=w; najw=l; }
        else if (w=wn) { najcz=w; najw=l; }
        else (w<wn);
        w=wn;
        l=ln; 
        }
        najcz=w;
        najw=l;

cout<<"Liczba najczesciej wylosowana to: "<<najw<<" zostala wylosowana "<<najcz<<" razy."<<endl;

system("pause");

}

Pozostało 580 znaków

2018-01-26 16:47

Do porównywania używa się == a do przypisywania = więc ten else-if trzeba poprawić:

else if (w = wn) { ... } // Linia 44

W tym for wychodzisz poza tablicę:

for (i = 0; i <= roz_tab; i++)
{
    Liczby[i] = i;
}

Dlatego że pierwszy element jest pod indeksem 0 a ostatni pod indeksem n - 1 gdzie u Ciebie n= 100. Warunek powinien być i < roz_tab. Do poprawy wszystkie 3 pętle ;)

Poza tym nazywaj te zmienne normalnie, nikomu nic nie mówi n, wn, l; aby zrozumieć po co są trzeba przeanalizować kod i pomyśleć co autor miał na myśli co nie powinno mieć miejsca.

I jeszcze na sam koniec - Nie używaj rand(), C++ ma <random>.

EDIT
To co napisałeś nie ma prawa działać, zobacz:

for (i = 0; i <= 1000000; i++) // losuje 1000001 liczb
{
    los = rand() % 101; // Wylosowana liczba trafia do zmiennej los

    for (int j = 0; j < 100; j++)
    {
        if (los == Liczby[j]) // Sprawdzanie czy los == 0 jako że wszystko w tablicy Liczby jest 0
        {
            IloscWys[j]++;
        }
    }
}
edytowany 2x, ostatnio: atmal, 2018-01-26 16:54

Pozostało 580 znaków

2018-01-26 19:28
0

Trochę ciężko twój kod się czyta (pewnie przez to co napisał @atmal, nazwy zmiennych kompletnie nic nie mówią, IloscWys?), więc nie mogłem się powstrzymać i napisałem coś takiego (zapewne dla nowicjusza też będzie ciężki do przeczytania), ale może pomoże (uwaga -std=c++14):

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <random>
using namespace std;

int main()
{
    std::mt19937 generator;
    generator.seed(std::time(0));
    std::uniform_int_distribution<int> distribution(0, 100);
    const int rozmiarWartosci = 101;

    int wartosci[rozmiarWartosci];
    for (int i = 0; i < rozmiarWartosci; i++) wartosci[i] = 0;  
    for (int i = 0; i < 1000000; i++) wartosci[distribution(generator)]++;

    int najczestsza = 0, najczesciejWylosowana;
    for (int i = 0; i < rozmiarWartosci; i++) 
    {
        if (najczestsza < wartosci[i]) 
        {
            najczestsza = wartosci[i];
            najczesciejWylosowana = i;
        }
    }

    cout << najczesciejWylosowana << endl;
}

PS. moje nazewnictwo też nie jest chyba za najlepsze, ale z pewnością czyta się lepiej niż ws, nw, ms itp etc itd.

edytowany 2x, ostatnio: czaffik, 2018-01-26 19:32

Pozostało 580 znaków

2018-01-26 20:24
0

O ile nie używa się zabytkowego kompilatora, a C++11 nie jest już wyzwaniem, zamiast

int wartosci[rozmiarWartosci];
    for (int i = 0; i < rozmiarWartosci; i++) wartosci[i] = 0;

można napisać

int wartosci[rozmiarWartosci]{};
#include <iostream>
#include <random>
#include <algorithm>
#include <iterator>
#include <array>
using namespace std;

#define ENDL std::cout << std::endl;
constexpr size_t arrSize = 101;

void Fill(array<int, arrSize>& arr)
{
   mt19937 gen(random_device{}());
   uniform_int_distribution<int> dist{ 0, 100 };
   for (int i = 0; i < 1000000; ++i) {
      ++arr[dist(gen)];
   }
}

int Max(const array<int, arrSize>& arr)
{
   return distance(begin(arr), max_element(begin(arr), end(arr)));
}

void Print(const array<int, arrSize>& arr)
{
   for (size_t i = 0; i < arr.size(); ++i) {
      cout << i << ": " << arr[i] << '\n';
   }   
   ENDL
}

int main()
{
   array<int, arrSize> arr{};
   Fill(arr);
   Print(arr);
   cout << Max(arr);
   ENDL
}

https://wandbox.org/permlink/uxAJlmXXLMhOjZJX
Można jeszcze zrobić funkcje szablonowe.


Nie pisz na priv. Zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: YooSy, 2018-01-26 20:42
No to gratuluję, że taki piękny kod produkujesz, szkoda że służy popisaniu się, a nie pomocy OP. - enedil 2018-01-26 22:05
Jak pokuta za szpanowanie? Usunę kod, jeśli faktycznie nie ma wartości. - YooSy 2018-01-26 22:18

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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