Losowe liczby

0

Cześć,

Bardzo zaskoczył mnie wynik działania poniższych komend:
dla ile = 100000 jest błąd, ale dla ile = 50000 średnia liczona jest poprawnie.

Wiecie może dlaczego tak się dzieje ?

#include<iostream>
#include<math.h>
#include<cstdlib>
#include<ctime>

using namespace std;
const double PI = 3.14159265358979323846;

double losuj();

int main(){
        srand(time(NULL));
	double s = 0;
	int ile = 100000;
	for(int i = 0; i < ile; i++)
		s += losuj();

	cout << s/ile << endl;

	system("PAUSE");
}

double losuj(){
	double u1 = (double)rand()/RAND_MAX;
	double u2 = (double)rand()/RAND_MAX;
	return sqrt(-2*log(u1))*cos(u2*2*PI);
}

double f(double x, double y, double r, double dt, double sigma){
	double tmp = ( log(y/x) - ( r-0.5*pow(sigma,2) )*dt ) / sigma / sqrt(dt) ;
	return exp( -pow(tmp,2)/2 ) / sqrt(2*PI) / sigma / y / sqrt(dt);	
}
0

Ile wynosi logarytm z zera?

0
#include<iostream>
#include<math.h>
#include<cstdlib>
#include<ctime>

using namespace std;
const long double PI = 3.14159265358979323846;

long double losuj();

int main(){
        srand(time(NULL));
        long double s = 0;
        int ile = 1000000;
        for(int i = 0; i < ile; i++)
                s+= losuj();

        cout << s/ile << endl;

        system("PAUSE");
}

long double losuj(){
        long double u1 = (long double)rand()/RAND_MAX;

        if ( u1 == 0 )
		return 0;

        long double u2 = (long double)rand()/RAND_MAX;
        long double retValue = sqrt(-2*log(u1))*cos(u2*2*PI);


	return retValue ;
}

Jak się logarytmuje 0, to się tak ma.
A prędzej czy później wylosujesz to zero...

Pozmieniane na long double... jakoś tak.

0

Dzięki za rozwiązanie problemu.
Prawdopodobieństwo, że wylosowałoby 0 jest równe 0, więc myślałem że ten przypadek się nie zdarzy.

0

Ilość liczb typu double reprezentowanych w komputerze jest skończona => prawdopodobieństwo wylosowania liczby 0 jest większe niż 0.
W modelu matematycznym, prawdopodobieństwo wylosowania każdej liczby wynosi 0. ale za każdym razem jakaś liczba jest losowana. Prawdopodobieństwo zdarzenia może wynosić 0, a zdarzenie może nastąpić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1