[C++] Program błądzenie losowe + histogram

shreder221
Użytkownik
Użytkownik
Posty: 181
Rejestracja: 5 cze 2015, o 21:45
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 50 razy
Pomógł: 2 razy

[C++] Program błądzenie losowe + histogram

Post autor: shreder221 »

Dzień dobry. Zrobiłem program, który zaczynając od \(\displaystyle{ 0}\) porusza się o \(\displaystyle{ \pm1}\) określoną ilość razy (na potrzeby postu nazwijmy ją \(\displaystyle{ k}\)). Wynik jest zapisywany w tablicy. Powyższe działania też są powtarzane określoną (exp) ilość razy. Następnie na podstawie wyników tworzę histogram, odchylenie i średnią.

Nie znam się jeszcze za bardzo na analizie danych, ale wydaje mi się że powinno istnieć jedno maximum lokalne w \(\displaystyle{ x=0}\). A wg kilkunastu prób, zwłaszcza dla większych \(\displaystyle{ k}\), istnieją \(\displaystyle{ 2}\) maxima za każdym razem oddalone o \(\displaystyle{ 3\div4}\) jednostki od środka.

Gdzieś się pomyliłem w kodzie programu? Czy po prostu nie wiem czegoś z zakresu Analizy danych, co sprawia, że taki rozkład wyników jest oczywisty.

KOD programu:
Ukryta treść:    
Ostatnio zmieniony 29 kwie 2018, o 16:34 przez SlotaWoj, łącznie zmieniany 1 raz.
Powód: Nieczytelny zapis - brak LaTeX-a. Proszę zapoznaj się z instrukcją: http://matematyka.pl/latex.htm . Polskie litery. Interpunkcja.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] Program błądzenie losowe + histogram

Post autor: Afish »

shreder221 pisze:

Kod: Zaznacz cały

//h//zakres histogramu -k/2:k/2 tzn o zakresie k+1 
const int exp=100000,k=200,h=k/2+1;
int tab[exp],histogram[h];
Najpierw piszesz, że histogram ma zakres k+1, a potem tworzysz tablicę o rozmiarze k/2 + 1.

Poza tym ten kod wybitnie ciężko się czyta. Jedna trzecia to komentarze, których w ogóle nie powinno być, czy nie lepiej zamiast tworzyć zmienną h i potem komentować jej znaczenie, nadać jej po prostu sensowną nazwę? Zamiast oddzielać bloki kodu komentarzem //|||||||||||||||||||||||||||||||||||||||HISTOGRAM, może lepiej wydzielić kod do osobnej funkcji?
shreder221
Użytkownik
Użytkownik
Posty: 181
Rejestracja: 5 cze 2015, o 21:45
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 50 razy
Pomógł: 2 razy

Re: [C++] Program błądzenie losowe + histogram

Post autor: shreder221 »

Błędna wielkość tablicy sprawiała jeszcze inne problemy i po kilku godzinach analizy zauważyłem ten błąd. Po poprawieniu zakresów ?błąd? cały czas występuje.

Pierwotnie napisałem bez jakichkolwiek komentarzy i kolejnego dnia jak przystąpiłem do kończenia programu miałem problemy z dokładnymi zakresami itd. Wtedy od początku przemyślałem program i wprowadziłem dokładne komentarze które później przyspieszyły pracę. Jak i pomogły wyłapać błąd z wielkością tablicy. Nazwy zmiennych była też nadawana od pełnych nazw.
h-histogram
k-kroki
W związku z czym nie miałem problemu z wyłapaniem co oznaczają.

Co do funkcji. Prawdopodobnie bym ich użył ale w poleceniu był zakaz używania funkcji. Na zajęciach też było wspomniane bodajże że argumenty typu tablica jakoś inaczej działają ale dokładniej omówimy to dalej. Zwłaszcza że to dopiero 2 zadanie z użyciem tablic które robimy. A prowadzący chciał ciut rozszerzyć wprowadzając histogram i błądzenie losowe.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

Re: [C++] Program błądzenie losowe + histogram

Post autor: Afish »

shreder221 pisze:Po poprawieniu zakresów ?błąd? cały czas występuje.
No to bez aktualnego kodu pozostaje zgadywać, co tam się dzieje.
shreder221 pisze: Pierwotnie napisałem bez jakichkolwiek komentarzy i kolejnego dnia jak przystąpiłem do kończenia programu miałem problemy z dokładnymi zakresami itd. Wtedy od początku przemyślałem program i wprowadziłem dokładne komentarze które później przyspieszyły pracę. Jak i pomogły wyłapać błąd z wielkością tablicy. Nazwy zmiennych była też nadawana od pełnych nazw.
h-histogram
k-kroki
W związku z czym nie miałem problemu z wyłapaniem co oznaczają.
A zamiast używać jednoliterowych nazw i magicznych liczb można porobić porządne zmienne. Zamiast komentować, że "h" oznacza "histogram" można po prostu nazwać zmienną "histogram".
shreder221
Użytkownik
Użytkownik
Posty: 181
Rejestracja: 5 cze 2015, o 21:45
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 50 razy
Pomógł: 2 razy

Re: [C++] Program błądzenie losowe + histogram

Post autor: shreder221 »

Kod: Zaznacz cały

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

int main(){
	//exp// liczba eksperymentów(tzn ile razy otrzymano 
	//exp//wyjściowy wynik powtórzeń pętli
	//k// -kroki tzn ile razy powtarzano +/- 1 ale!! zakres będzie
	//k// dzielony przez 2 aby uzyskać zarówno parzyste jak i nie
	//h//zakres histogramu {-k/2:k/2} tzn o zakresie k+1 
	const int exp=100000,k=200,h=k+1;
	int tab[exp],histogram[h];
	// start/// zmienna na której operuje się +/-1
	int start,srednia,wariancja;
	//
	srand(time(0));

// eksperyment// for na j powtarza eksperyment exp razy
	for(int j=0;j<exp;j++){
//start=0 --> punkt startowy every experymentu =0
		start=0;
//for na i wykonuje pojedynczy experyment
		for(int i=0;i<k;i++){
			if(int(rand())%2==1) start++;
			else start--;
		}
	tab[j]=start/2;

	}
	
//ze względu na bardzo duże możliwe exp kasuje to żeby sprawdzić histogram
//	for(int i=0;i<exp;i++){
//		cout<<tab[i]<<endl;
//	}

		//srednia////////////////////////
	for(int i=0;i<exp;i++){
		srednia+=tab[i];
	}
	srednia/=2;
	cout<<"srednia="<<srednia<<endl;
		// wariancja/////////////////////
	for(int i=0;i<exp;i++){
		wariancja+=(tab[i]-srednia)*(tab[i]-srednia);
	}
	wariancja/=exp;
	cout<<"wariancja="<<wariancja<<endl;
//|||||||||||||||||||||||||||||||||||||||HISTOGRAM
//pętla w pętli wewnetrzna jezdzi po kazdym wyniku
//i sprawdza czy jest równa 
cout<<endl<<endl<<endl<<endl<<endl<<endl;
	for(int j=-k/2;j<k/2+1;j++){	
		histogram[k/2+j]=0;
		
		for(int i=0;i<exp;i++){	
			if(tab[i]==j)histogram[k/2+j]++;
		
		}
		cout<<j<<"	"<<histogram[k/2+j]<<endl;
		
	}


	
return 0;
}
ODPOWIEDZ