Liczby losowe i zliczanie ich powtórzeń
Ostatnio zmodyfikowano 2018-01-11 12:54
Macjeg Temat założony przez niniejszego użytkownika |
Liczby losowe i zliczanie ich powtórzeń » 2017-12-31 17:01:03 Witam, próbuję stworzyć program losujący milion liczb losowych z zakresu od 0 do 100, a następnie zliczający ilość ich powtórzeń i wyświetlający liczbę najczęściej powtarzaną, 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" ); }
Niestety po uruchomieniu aplikacja wywala błąd i wyłącza się. Proszę o pomoc i z góry dziękuję za wszelkie rady. |
|
Monika90 |
» 2017-12-31 17:09:24 Nie zainicjalizowałeś zmiennej ilosc. A najlepiej gdyby to nie byłą zmienna, tylko stała określająca rozmiar tablicy tab. |
|
6675636b206f6666 |
» 2018-01-10 21:58:39 Lekko zmodyfikowane rozwiązanie Twojego problemu - dodatkowo cały proces zliczania jest powtarzany (tu akurat 10 razy). Z wykorzystaniem funkcji std::rand : #include <algorithm> #include <array> #include <cstdlib> #include <ctime> #include <functional> #include <iostream>
constexpr inline void repeat( size_t times, auto && cb ) { for( size_t i = 0; i < times; ++i ) cb(); }
int main() { std::srand( std::time( NULL ) ); repeat( 10,[ & ] { std::array < unsigned int, 101 > result; result.fill( 0 ); repeat( 1000000,[ & ] { result[ std::rand() % 101 ] ++; } ); auto max = std::max_element( result.begin(), result.end() ); std::cout << std::distance( result.begin(), max ) << " " << * max << std::endl; } ); }
Z wykorzystaniem biblioteki random (i std::random_device ): #include <algorithm> #include <array> #include <functional> #include <iostream> #include <random>
constexpr inline void repeat( size_t times, auto && cb ) { for( size_t i = 0; i < times; ++i ) cb(); }
int main() { std::random_device rd; std::uniform_int_distribution < size_t > dist( 0, 100 ); repeat( 10,[ & ] { std::array < unsigned int, 101 > result; result.fill( 0 ); repeat( 1000000,[ & ] { result[ dist( rd ) ] ++; } ); auto max = std::max_element( result.begin(), result.end() ); std::cout << std::distance( result.begin(), max ) << " " << * max << std::endl; } ); }
Rozwiązanie możesz przetestować tutaj. |
|
mateczek |
» 2018-01-11 04:40:02 @fuck off konkurs na udziwnienia ?? moja propozycja :) #include <iostream> #include<algorithm> #include<map> #define repeat(n) for(int i = 0; i < n; ++ i) using namespace std; int main() { srand( time( NULL ) ); map < int, int > tablica; repeat( 1000000 ) { tablica[ rand() % 100 + 1 ] ++; } std::map < int, int >::iterator max = std::max_element( tablica.begin(), tablica.end(), []( const pair < int, int > el1, const pair < int, int > el2 ) { return el1.second < el2.second; } ); cout << "elemnet " << max->first << " wystapil razy " <<( * max ).second << endl; }
|
|
pekfos |
» 2018-01-11 12:54:24 Konkurs udziwniania dotyczy u was też kodu? To samo, tylko że z sensem: #include <iostream> #include <cstdlib> #include <ctime>
int main() { srand( time( NULL ) ); int tab[ 100 ] = { }, max = 0, max_e; for( int i = 0; i < 1000000; ++i ) { const int elem = rand() % 100; const int tmp = ++tab[ elem ]; if( tmp > max ) max = tmp, max_e = elem; } std::cout << "elemnet " << max_e + 1 << " wystapil razy " << max << std::endl; } |
|
« 1 » |