//GCL multiplicativo de la forma Xn=aXn-1 mod m //el (método de Schrage): nos dice : //ax mod m = g(x) + mh(x) //donde //g(x) = a(x mod q) - r(x div q) //y //h(x) = (x div q) - (ax div m) //donde //q = m div a y r = m mod a.
//http://webdelprofesor.ula.ve/ingenieria/hhoeger/simulacion/PARTE4.pdf //http://slideplayer.es/slide/120717/#
//problema 2 ...Xn=7^5 Xn-1 mod( 2^31-1)
//entonces multiplicador a=16807, modulo m= 2147483647 //X0=12457 y mostrar los primeros 20 numeros generados
#include<stdlib.h> #include<iostream> #include<stdio.h> using namespace std;
double random(int ,int,int);
main() { int semilla;//semilla int modulo,multiplicador; double ran,a;
int i=0;
cout<<"semilla: "<<endl; cin>>semilla; cout<<"modulo: "<<endl; cin>>modulo; cout<<"multiplicador: "<<endl; cin>>multiplicador;
cout<<endl; ran=random(semilla,modulo,multiplicador); cout<<(ran/modulo); cout<<endl; do{ a=ran; //cout<<a; ran=random(a,modulo,multiplicador);
cout<<endl; cout<<ran/modulo; cout<<endl; //para contabilizar los periodos i++;
}while(i<20); cout<<"periodo= "<<i<<endl; }
double random(int x,int m,int a) { double y; int random; int q,r; double aux=0; //a=3; //multiplicador //m = 31; //modulo q=m/a; //m div a r=m%a; //m mod a
y=a*(x%q)-r*(x/q); //cout<<y<<endl; if(y<0) //else { aux=y+m; return aux; } return y; }
|