[ kajla @ 22.01.2006. 21:03 ] @
Kako da izračunam verovatnoću da drvce duzine L slučajno bačeno na resetku razmaka d (d>=L) preseče jednu od linija rešetke? Treba da se dobije 2/Pi*L/d. Ako neko zna neka detaljno objasni postupak.

poz.
[ Farenhajt @ 22.01.2006. 23:19 ] @
Sve o tome možeš naći ovde
[ kajla @ 23.01.2006. 13:42 ] @
Da li neko može da objasni kako ovo dobija:
P(x)=


poz.

[Ovu poruku je menjao kajla dana 23.01.2006. u 14:43 GMT+1]
[ Farenhajt @ 23.01.2006. 13:57 ] @
Čini mi se da je ovo posredi: Ako ti drvce padne u rasponu uglova od do (mereno spram vodoravne ose), onda će ono preseći liniju ako mu se levi kraj nađe na odstojanju ne većem od od najbliže uspravne linije nadesno. Prema principu geometrijskih verovatnoća, verovatnoća prvog događaja jeste , a drugog .

[Ovu poruku je menjao Farenhajt dana 23.01.2006. u 15:09 GMT+1]
[ UrosMG @ 28.01.2006. 20:00 ] @
A evo ti i jedan sasvim drugi nacin: Monte Karlo simulacija u C++(a verovatno radi i u C-u). Jedina mana je sto ne mozes da dobijes precizniji rezultat za verovatnocu nego onaj koji dobijes kada u formulu 2/Pi*L/d ubacis pi koje je izracunato preko math funkcija u C++.

Kod je sledeci:
Code:

# include <iostream.h>
# include <fstream.h>
# include <math.h>

#define IM1 2147483563
#define IM2 2147483399
#define AM (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014
#define IA2 40692
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791
#define NTAB 32
#define NDIV (1+IMM1/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)

float ran2(long *idum)
{
    int j;
    long k;
    static long idum2=123456789;
    static long iy=0;
    static long iv[NTAB];
    float temp;

    if (*idum <= 0) {
        if (-(*idum) < 1) *idum=1;
        else *idum = -(*idum);
        idum2=(*idum);
        for (j=NTAB+7;j>=0;j--) {
            k=(*idum)/IQ1;
            *idum=IA1*(*idum-k*IQ1)-k*IR1;
            if (*idum < 0) *idum += IM1;
            if (j < NTAB) iv[j] = *idum;
        }
        iy=iv[0];
    }
    k=(*idum)/IQ1;
    *idum=IA1*(*idum-k*IQ1)-k*IR1;
    if (*idum < 0) *idum += IM1;
    k=idum2/IQ2;
    idum2=IA2*(idum2-k*IQ2)-k*IR2;
    if (idum2 < 0) idum2 += IM2;
    j=iy/NDIV;
    iy=iv[j]-idum2;
    iv[j] = *idum;
    if (iy < 1) iy += IMM1;
    if ((temp=AM*iy) > RNMX) return RNMX;
    else return temp;
}
#undef IM1
#undef IM2
#undef AM
#undef IMM1
#undef IA1
#undef IA2
#undef IQ1
#undef IQ2
#undef IR1
#undef IR2
#undef NTAB
#undef NDIV
#undef EPS
#undef RNMX


int main()
{
    int sum=0;
    double z,phi,pi,kos;
    long seed=123456789,see=1278;
    pi=4*atan(1.);
    ofstream fout("Izlaz.txt");
    int j;
    for(j=10000;j<=10000000;j+=10000)
    {
        sum=0;
        for (int i=1;i<=j;i++)
        {
            z=ran2(&seed);
            phi=pi*ran2(&see);
            kos=(cos(phi));
            if (kos<0) kos=(-1.)*kos;
            if (kos>z) sum++;
        }
        fout<<(sum*1.)/(j*1.)<<" "<<j<<endl;
    }
    return 0;
}


Prvi deo ti je random funkcija, ona ti je potrebna da bi ti random bacao polozaje na koje ce sibica pasti. E sad, ne secam se sta tacno izbacuje ovaj program, trebao bi valjda procenat onih sibica koji su pali na resetku. Program je napisan tako da bacas 10000, pa onda 20000, pa onda 30000, pa... sve do 10000000. Ne znam koliko dugo radi, mozes da smanjis maksimalnu vrednost j sa 10000000 na 100000. Da menjas korak mozes. Itd... I trebace ti kreiran fajl "Izlaz.txt".

Ako ti ne radi, reci pa cu otkriti zasto ne radi...