• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Losowanie i zliczanie wyników

Object Storage Arubacloud
0 głosów
962 wizyt
pytanie zadane 31 grudnia 2017 w C i C++ przez Macjeg Nowicjusz (150 p.)

Witam, próbuję stworzyć program który wylosuje milion liczb losowych z zakresu od 0 do 100, a następnie zliczy ich powtórzenia i wyświetli liczbę najczęściej wylosowaną oraz ilość jej powtórzeń, napisałem taki kod: 

 

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

using namespace std;

int main() {
int liczba;
int tab[101] = { 0 };
cout << "Wylosowanie 1000000 liczb calkowitych ze zbioru od 0 do 100" << endl;

srand(time(NULL));
for (int i = 0; i <= 1000000; i++) {
    liczba = rand() % 100 + 1;
    tab[liczba]++;
}
int ilosc;
int max = tab[0];
int pozycja = 0;
for (int i = 0; i < ilosc; i++)
{
   if (tab[i] > max)
   {
       pozycja = i;
       max = tab[i];
    }
}
std::cout<<pozycja+1<<"  "<<tab[pozycja+1];
system("pause");
}

ale niestety coś w nim jest nie tak i nie mogę zrozumieć co.

Z góry dziękuję za wszelką pomoc i porady.

1 odpowiedź

+1 głos
odpowiedź 31 grudnia 2017 przez niezalogowany
wybrane 1 stycznia 2018 przez Macjeg
 
Najlepsza

Zmienna ilość nie jest zainicjowana. Poprawiłem też kilka rzeczy, bo jak rozumiem chcesz losować 1'000'000 liczb z zakresu od 0 - 100 włącznie z 0 i 100:

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

int main() {
	
	const int ilosc = 101;
	int tab[ilosc] = { 0 };
	std::cout << "Wylosowanie 1000000 liczb calkowitych ze zbioru od 0 do 100" << std::endl;

	srand(time(NULL));
	for (int i = 0; i < 1000000; i++) // tutaj <, bo losujesz 1'000'000, a nie 1'000'001
	{
		int liczba = rand() % ilosc;
		tab[liczba]++;
	}
	
	int max = tab[0];
	int pozycja = 0;
	for (int i = 0; i < ilosc; i++)
	{
		if (tab[i] > max)
		{
			pozycja = i;
			max = tab[i];
		}
	}

	std::cout << pozycja << "  " << tab[pozycja] << "\n";
	system("pause");
}

PS. Warto wiedzieć, że C++ dostarcza wiele gotowych funkcji, które łatwo rozwiązują takie zadania:

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

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

	const size_t size = 101;
	int array[size]{};
	std::cout << "Wylosowanie 1000000 liczb calkowitych ze zbioru od 0 do 100\n";

	for (size_t i = 0; i < 1'000'000; i++) 
	{
		int number = rand() % size;
		array[number]++;
	}
	
	auto max = std::max_element(array, array + size);
	std::cout << std::distance(array, max) << "  " << *max << "\n";
}
komentarz 1 stycznia 2018 przez Macjeg Nowicjusz (150 p.)
Niestety, żaden z kodów które napisałeś nie działa u mnie, w pierwszym po prostu konsola jest pusta, a w drugim wyrzuca błąd w linii "auto max = std::max_element(array, array + size);"
komentarz 1 stycznia 2018 przez niezalogowany
Nie może być pusta w pierwszym przypadku...
komentarz 1 stycznia 2018 przez niezalogowany
Może masz wolny komputer i musisz dać mniejszą liczbę zamiast 10000000 np 1000
komentarz 1 stycznia 2018 przez Macjeg Nowicjusz (150 p.)
Nie, nie mam wolnego komputera. Poza tym nawet dla szkolnego złomka to nie powinien być problem.
komentarz 1 stycznia 2018 przez Macjeg Nowicjusz (150 p.)
Zauważyłem że program działa, ale wyświetla tylko na chwile wynik, po czym okno konsoli robi się malutkie, a po powiekszeniu jest puste. Jak to naprawić?
komentarz 1 stycznia 2018 przez Macjeg Nowicjusz (150 p.)
Okej, udało mi się to naprawić, zastąpiłem system("pause") za pomocą getchar() i return 0.

Dziękuję za pomoc.
komentarz 1 stycznia 2018 przez niezalogowany
Dziwne. Z jakiego środowiska korzystasz? CodeBlock/Dev/Visual?

EDIT: Okej ;)

Podobne pytania

0 głosów
1 odpowiedź 1,832 wizyt
0 głosów
0 odpowiedzi 118 wizyt
0 głosów
2 odpowiedzi 1,728 wizyt
pytanie zadane 26 maja 2020 w C i C++ przez saju13013 Nowicjusz (230 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...