Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Liczby losowe i zliczanie ich powtórzeń

Ostatnio zmodyfikowano 2018-01-11 12:54
Autor Wiadomość
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:
C/C++
#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.
P-168290
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.
P-168291
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
:
C/C++
#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
):
C/C++
#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.
P-168596
mateczek
» 2018-01-11 04:40:02
@fuck off
konkurs na udziwnienia ??

moja propozycja :)
C/C++
#include <iostream>
#include<algorithm>
#include<map>
#define repeat(n) for(int i = 0; i < n; ++ i) //:P
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;
}
P-168621
pekfos
» 2018-01-11 12:54:24
Konkurs udziwniania dotyczy u was też kodu? To samo, tylko że z sensem:
C/C++
#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;
}
P-168623
« 1 »
  Strona 1 z 1