Losowanie liczb pseudolosowych

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;
}
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++;
0

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

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++) { ... }
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.

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");

}

2

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]++;
        }
    }
}
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.

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.

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