Witam!
Na zajęcia mam napisać liniowy mieszany generator liczb pseudolosowych. o postaci x=(a*x+c)%m..
Do tego mam przeprowadzić test Pi zgodnie ze wzorem podanym przez wykładowce.. oraz informacji podanych na wykładzie.
Jeżeli chodzi o test pi to mam losować współrzędne punktu i sprawdzac czy odległość punktu jest <= 1 od srodka okręgu.
Oto Kod programu:
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<fstream>
using namespace std;
long long unsigned test[1001];
long long unsigned m= pow(2,32);///63 c nie moze byc parzyste
long long unsigned x;
long long unsigned a=500000;
long long unsigned c= 33633;
long long unsigned S=42542; ///Zarodek
long long unsigned generator(long long unsigned x,long long unsigned a, long long unsigned c)
{
return (a*x+c)%m;
}
double piTest(long long unsigned *test);
ofstream wyj;
int main(void)
{
wyj.open("Wyjscie.txt",ios::app);
if(wyj.fail())
{
cout<<"Nie udalo sie nawiazac polaczenia z plikiem\n";
exit(1);
}
double wynik;
cout<<"POCZATEK TESTU PI!\n";
x=S;
for(int i=0;i <1001;i++)
{
x=generator(x,a,c);
test[i]=x;
}
wynik=piTest(test);
cout<<wynik<<endl;
if(wynik<=3.14 && wynik>=3.12)
{
wyj<<"A: "<<a<<" C: "<<c<<" Wynik testu: "<<wynik<<endl;
wyntest=true;
}
cout<<"KONIEC TESTU!\n";
cout<<"Uzupelniono plik wyjsciowy\n";
cout<<"Program zostal wykonany, wcisnij dowolny klawisz: \n";
getch();
return 0;
}
///Funkcja przeprowadzajaca test pi;
double piTest(long long unsigned *test)
{
unsigned ile=0;///Licznik zliczajacy ilosc pkt w kole
///sqrt( pow((x2-x1),2)+pow((y2-y1),2) ) - wzor na odl dwoch punktow od siebie. |AB|= sqrt( (x2-x1)^2+ (y2-y1)^2);
///nasz punkt bazowy to srodek okregu w pkt S=(0,0) i r=1;
for(int i=0;i<1001;i++)
{
if(sqrt( pow((test[i]-0),2)+ pow(test[i+1]-0,2))<=1)ile++;
}
return 4.0*(double(ile)/1000); ///1000 poniewaz tablica test ma 1000 el.
}
Pytanie moje jest następujące:
Czy może mi ktoś powiedzieć jak wyznaczyć te współczynniki a oraz c, w taki sposób żeby ten generator miał szanse przejść ten test PI?
albo jeszcze lepiej wyznaczyć jakieś współczynniki, które sprawą że ten generator przejdzie test pi?..
W teście Pi chodzi o to żeby otrzymany wynik zbiegał do liczby PI albo w przybliżeniu wynosił tyle co liczba PI.
Co do wartości c,a jakie mam przypisane w kodzie, to są ostatnie wartości jakie próbowałem wpisywać na chybił trafił... ponieważ wcześniejsze wyliczone zgodnie z podanymi na wykładzie kryteriami również nie działały..