[C] tester generatora liczb pseudolosowych

Michalf
Użytkownik
Użytkownik
Posty: 40
Rejestracja: 13 lis 2010, o 16:54
Płeć: Mężczyzna
Lokalizacja: PL

[C] tester generatora liczb pseudolosowych

Post autor: Michalf »

muszę napisać generator liczb pseudolosowych w C, a następnie przetestować ich losowość --> wyświetlić ile razy każda została wygenerowana i przedstawić za pomocą histogramu.

Zrobiłem generator przykładowych 50 liczb:

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>

#include <time.h>

int main(void)
{
    int i,j,tab[1000]={0},how_many[50]={0};
srand(time(NULL));
    for (i=0;i<1000;i++) {
        tab[i]=(rand()%50)+1;
        how_many[tab[i]-1]++;
        }

    for (j=0;j<50;j++)
        printf("%d	%d
",j+1,how_many[j]);

    
return 0;
}
Mam prośbę o pomoc w modyfikacji programu, tak by wyświetlał np:
dana liczba *************
dana liczba *************************
dana liczba*************

gdzie gwiazdki są histogramem wystąpienia liczby.

Z góry bardzo dziękuję
tomkoder
Użytkownik
Użytkownik
Posty: 75
Rejestracja: 8 gru 2013, o 12:20
Płeć: Mężczyzna
Lokalizacja: Warszawa
Pomógł: 19 razy

[C] tester generatora liczb pseudolosowych

Post autor: tomkoder »

Skoro masz już tablicę w której masz ilość wystąpień każdej liczby to dodaj po prostu przed return 0; pętlę która przejdzie po każdej komórce z tej tablicy i wyświetli tyle gwiazdek jaka jest zawartość komórki, czyli (pseudokod):

Kod: Zaznacz cały

for(j=0; j<50; j++)
	{
	echo "
ilosc wystapienia liczby j+1:";
	for(i=0; i<how_many[j]; i++)
		{printf("*");}
	}
Michalf
Użytkownik
Użytkownik
Posty: 40
Rejestracja: 13 lis 2010, o 16:54
Płeć: Mężczyzna
Lokalizacja: PL

[C] tester generatora liczb pseudolosowych

Post autor: Michalf »

tomkoder - wielkie dzięki. Działa.
Mam jednak kolejny problem - chciałbym, żeby liczba gwiazdek była skalowana - przykładowo, badając 100000 liczb, moja konsola dostanie bzika... program nie będzie czytelny.
Chciałbym to zmodyfikować tak by pewna ilość gwiazdek była 100%.
Masz pomysł?
ravgirl
Użytkownik
Użytkownik
Posty: 171
Rejestracja: 29 gru 2013, o 17:41
Płeć: Kobieta
Lokalizacja: Pruszków
Pomógł: 64 razy

[C] tester generatora liczb pseudolosowych

Post autor: ravgirl »

Liczba gwiazdek odpowiadająca 100% to jakaś stała (dowolna liczba, np. 100 dla uproszczenia), nazwijmy ją np.

Kod: Zaznacz cały

int MAX_STARS = 100
100%, czyli całość - liczba wszystkich liczb (:)) - w tym przypadku jest to rozmiar tablicy tab, czyli 1000. Napiszę używając bezpośrednio tej liczby, ale proponuję wyciągnąć to jako jakąś stałą i jej używać, będzie prościej i czytelniej.

Teraz musimy zmodyfikować nieco pętlę rysującą gwiazdki. Chcemy obliczyć jaką część całości stanowią wystąpienia danej liczby - czyli dzielimy jej wystąpienia przez 1000 (liczba wystąpień wszystkich liczb, nasze 100%), pamiętając o rzutowaniu na double albo floaty, bo inaczej wyjdą same zera. Następnie mnożymy przez MAX_STARS, dzięki czemu wiemy, jaką część gwiazdek narysować:

(pseudokod, może się nie kompilować)

Kod: Zaznacz cały

int stars_count=0;
for(j=0; j<50; j++)
   {
   echo "
ilosc wystapienia liczby j+1:";
   stars_count = (float)how_many[j] / (float)1000 * MAX_STARS;

   for(i=0; i<stars_count; i++)
      {
            printf("*");
      }
   }
Michalf
Użytkownik
Użytkownik
Posty: 40
Rejestracja: 13 lis 2010, o 16:54
Płeć: Mężczyzna
Lokalizacja: PL

[C] tester generatora liczb pseudolosowych

Post autor: Michalf »

Zrobiłem tak:

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
    int i,j,tab[1000]={0},how_many[50]={0};
    int MAX_STARS = 100;
srand(time(NULL));
    for (i=0;i<1000;i++) {
        tab[i]=(rand()%50)+1;
        how_many[tab[i]-1]++;
        }

    for (j=0;j<50;j++)
        printf("%d	%d
",j+1,how_many[j]);

int stars_count=0;
for(j=0; j<50; j++)
   {
  printf( "
ilosc wystapienia liczby %d", j+1);
   stars_count = (float)how_many[j] / (float)1000 * MAX_STARS;

   for(i=0; i<stars_count; i++)
      {
            printf("*");
      }
   }
Kompilator wywala:
error: expected declaration or statement at end of input
W czym jest problem?
luka52
Użytkownik
Użytkownik
Posty: 8601
Rejestracja: 1 maja 2006, o 20:54
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 47 razy
Pomógł: 1816 razy

[C] tester generatora liczb pseudolosowych

Post autor: luka52 »

Michalf, brakuje } na końcu - funkcja main nie jest zamknięta.
ODPOWIEDZ