You are on page 1of 11

Genaracion de números pseudoaleatorios

1. Generar 50 números entre 0 y 1 con los siguientes parámetros: a = 19, c = 33, Xo = 37, y m =
100.

% Xn+1 = (a(s) + c) Mod m


function [x,u]=gmixto(s)

n=input('ingrese el tamaño de muestra: ');


disp('--------------------------------');
disp(' n Un+1');
disp('--------------------------------');

for i=1:n
x(i)=mod((19*s)+33,100);
s=x(i);
u(i)=s/100;
fprintf('%6.0f %3.4f\t\n',i,u(i));
end

2. Generar suficientes números entre 0 y 1 con los siguientes parámetros:

a) 𝐗 𝐧+𝟏 = (𝟏𝟑𝐗 𝐧 + 𝟕)𝐦𝐨𝐝 𝟖 𝐗𝟎 = 𝟔


% Xn+1 = (a(s) + c) Mod m
function [x,u]=gmixto(s)
n=input('ingrese el tamaño de muestra: ');
disp('--------------------------------');
disp(' n Un+1');
disp('--------------------------------');

for i=1:n
x(i)=mod((13*s)+7,8);
s=x(i);
u(i)=s/8;
fprintf('%6.0f %3.4f\t\n',i,u(i));
end

b) 𝐗 𝐧+𝟏 = (𝟓𝟎𝐗 𝐧 + 𝟏𝟕)𝐦𝐨𝐝 𝟔𝟒 𝐗 𝟎 = 𝟏𝟑𝟕


% Xn+1 = (a(s) + c) Mod m
function [x,u]=gmixto(s)

n=input('ingrese el tamaño de muestra: ');


disp('--------------------------------');
disp(' n Un+1');
disp('--------------------------------');

for i=1:n
x(i)=mod((50*s)+17,64);
s=x(i);
u(i)=s/64;
fprintf('%6.0f %3.4f\t\n',i,u(i));
end
c) 𝐗 𝐧+𝟏 = (𝟓𝐗 𝐧 + 𝟐𝟒)𝐦𝐨𝐝 𝟑𝟐 𝐗𝟎 = 𝟕
% Xn+1 = (a(s) + c) Mod m
function [x,u]=gmixto(s)

n=input('ingrese el tamaño de muestra: ');


disp('--------------------------------');
disp(' n Un+1');
disp('--------------------------------');

for i=1:n
x(i)=mod((5*s)+24,32);
s=x(i);
u(i)=s/32;
fprintf('%6.0f %3.4f\t\n',i,u(i));
end
d) 𝐗 𝐧+𝟏 = (𝟓𝐗 𝐧 + 𝟐𝟏)𝐦𝐨𝐝 𝟏𝟎𝟎 𝐗𝟎 = 𝟑
% Xn+1 = (a(s) + c) Mod m
function [x,u]=gmixto(s)

n=input('ingrese el tamaño de muestra: ');


disp('--------------------------------');
disp(' n Un+1');
disp('--------------------------------');

for i=1:n
x(i)=mod((5*s)+21,100);
s=x(i);
u(i)=s/100;
fprintf('%6.0f %3.4f\t\n',i,u(i));
end

3. Determine el periodo de los siguientes generadores congruenciales multiplicativos:

a) 𝐗 𝐧+𝟏 = (𝟐𝟏𝐗 𝐧 )𝐦𝐨𝐝 𝟑𝟐 𝐗 𝟎 = 𝟏𝟕


% Xn+1 = (a(s)) Mod m
function [x,u]=gmulti(s)

n=input('ingrese el tamaño de muestra: ');


disp('--------------------------------');
disp(' n Un+1');
disp('--------------------------------');

for i=1:n
x(i)=mod((21*s),32);
s=x(i);
u(i)=s/32;
fprintf('%6.0f %3.4f\t\n',i,u(i));
end

b) 𝐗 𝐧+𝟏 = (𝟐𝟏𝟏𝐗 𝐧 )𝐦𝐨𝐝 𝟏𝟎𝟖 𝐗 𝟎 = 𝟏𝟗


% Xn+1 = (a(s)) Mod m
function [x,u]=gmulti(s)

n=input('ingrese el tamaño de muestra: ');


disp('--------------------------------');
disp(' n Un+1');
disp('--------------------------------');

for i=1:n
x(i)=mod((211*s),100000000);
s=x(i);
u(i)=s/100000000;
fprintf('%6.0f %3.4f\t\n',i,u(i));
end
c) 𝐗 𝐧+𝟏 = (𝟐𝟐𝟏𝐗 𝐧 )𝐦𝐨𝐝 𝟏𝟎𝟑 𝐗𝟎 = 𝟑
% Xn+1 = (a(s)) Mod m
function [x,u]=gmulti(s)

n=input('ingrese el tamaño de muestra: ');


disp('--------------------------------');
disp(' n Un+1');
disp('--------------------------------');

for i=1:n
x(i)=mod((221*s),1000);
s=x(i);
u(i)=s/1000;
fprintf('%6.0f %3.4f\t\n',i,u(i));
end

d) 𝐗 𝐧+𝟏 = (𝟓𝐗 𝐧 )𝐦𝐨𝐝 𝟔𝟒 𝐗𝟎 = 𝟕


% Xn+1 = (a(s)) Mod m
function [x,u]=gmulti(s)

n=input('ingrese el tamaño de muestra: ');


disp('--------------------------------');
disp(' n Un+1');
disp('--------------------------------');

for i=1:n
x(i)=mod((5*s),64);
s=x(i);
u(i)=s/64;
fprintf('%6.0f %3.4f\t\n',i,u(i));
end

4. Estúdiese (ui, ui+1) e (n, ui) para los generadores congruenciales de los ejercicios 1, 2 y 3. ¿Qué
puede concluir?

En los ejercicios 1, 2 y 3, los números obtenidos están uniformemente distribuidos en el intervalo


0 y 1 pero no son independientes.

En el ejercicio 3, cuando “m” toma el valor “p^d” se facilita el cálculo de número uniforme (Un =
xn+1/m), ya que solo se corre el punto binario o decimal a la izquierda del número.

Reproducibles y se generan a gran velocidad.

Sin repetición dentro de una longitud determinada (periodo máximo).

5. Generar, a partir del generador cuadrático, suficientes números enteros hasta alcanzar el
periodo de vida, considerando los siguientes parámetros: d = 27, a = 26, c = 27, xo = 13, y m = 8.
% Xn+1 = ((d*(Xo^2))+(a*Xo)+c) Mod m
function [x,u]=gmulti(s)

n=input('ingrese el tamaño de muestra: ');


disp('--------------------------------');
disp(' n Un+1');
disp('--------------------------------');

for i=1:n
x(i)=mod((27*(s^2))+(26*s)+27,8);
s=x(i);
u(i)=s/8;
fprintf('%6.0f %3.4f\t\n',i,u(i));
end

6. Implemente y compare los siguientes algoritmos de generación de números psudoaleatorios.

a) Algoritmo de cuadrados medio: Generar los primeros 15 números ri a partir de una semilla X0 =
5735.

EJEMPLO: Yi = Xo^2 Xo=5735


% Algoritmo de cuadrados medio
function [x,u]=cuadradomedio(x0)
n=input('ingrese el tamaño de muestra: ');
disp('--------------------------------');
disp(' n Xn+1 Un+1');
disp('--------------------------------');
for i=1:n
y=x0^2;
if y >9999999
ystr=num2str(y); %Paso el número a cadena
x1=ystr(3:6); %Obtengo los 4 dígitos centrales
end
if y < 9999999 && y >999999
ystr=num2str(y); %Paso el número a cadena
ystr=strcat('0',ystr); % Le añado un cero al principio de la cadena.
x1=ystr(3:6); %Obtengo los 4 dígitos centrales
end
if y > 99999 && y < 999999
ystr=num2str(y); %Paso el número a cadena
x1=ystr(2:5); %Obtengo los 4 dígitos centrales
end
if y < 99999 && y >9999
ystr=num2str(y); %Paso el número a cadena
ystr=strcat('0',ystr); % Le añado un cero al principio de la cadena.
x1=ystr(2:5); %Obtengo los 4 dígitos centrales
end
if y > 999 && y < 10000
ystr=num2str(y); %Paso el número a cadena
x1=ystr(1:4); %Obtengo los 4 dígitos centrales
end
if y < 1000
fprintf('Imposible continuar \n');
break;
end
u1=str2num(x1); %Convierto la cadena a número
x0=u1; %guardo la siguiente semilla.
u1=u1/10000; %Divido para obtener el número aleatorio entre 0 y 1
fprintf('%6.0f %6.0f\t %2.4f\n',i,x0,u1);
end

b) Algoritmo de productos medios Generar los primeros 15 números ri a partir de una semilla X0 =
5015 y X1 = 5734.

EJEMPLO: Yi = Xo*Xi Xo= 5015 X1= 5734


% Algoritmo de productos medios
function [x,u]=productmedios(x0,x1)
n=input('ingrese el tamaño de muestra: ');
disp('--------------------------------');
disp(' n Xn+1 Un+1');
disp('--------------------------------');
for i=1:n
y=x0*x1;
if y >9999999
ystr=num2str(y); %Paso el número a cadena
d1=ystr(3:6); %Obtengo los 4 dígitos centrales
end
if y < 9999999 && y >999999
ystr=num2str(y); %Paso el número a cadena
ystr=strcat('0',ystr); % Le añado un cero al principio de la cadena.
d1=ystr(3:6); %Obtengo los 4 dígitos centrales
end
if y > 99999 && y < 999999
ystr=num2str(y); %Paso el número a cadena
d1=ystr(2:5); %Obtengo los 4 dígitos centrales
end
if y < 99999 && y >9999
ystr=num2str(y); %Paso el número a cadena
ystr=strcat('0',ystr); % Le añado un cero al principio de la cadena.
d1=ystr(2:5); %Obtengo los 4 dígitos centrales
end
if y > 999 && y < 10000
ystr=num2str(y); %Paso el número a cadena
d1=ystr(1:4); %Obtengo los 4 dígitos centrales
end
if y < 1000
fprintf('Imposible continuar \n');
break;
end
u1=str2num(d1); %Convierto la cadena a número
x0=x1;
x1=u1; %guardo la siguiente semilla.
u1=u1/10000; %Divido para obtener el número aleatorio entre 0 y 1
fprintf('%6.0f %6.0f\t %2.4f\n',i,x1,u1);
end

c) Algoritmo de multiplicador constante Generar los primeros 15 números ri a partir de una semilla
X0 = 9803 y constante c = 6965

EJEMPLO: Yi = Co*Xo Xo= 9803 Co= 6965


% Algoritmo de multiplicador constante
function [x,u]=multiconst(c0,x0)
n=input('ingrese el tamaño de muestra: ');
disp('--------------------------------');
disp(' n Xn+1 Un+1');
disp('--------------------------------');

for i=1:n
y=c0*x0;
if y >9999999
ystr=num2str(y); %Paso el número a cadena
d1=ystr(3:6); %Obtengo los 4 dígitos centrales
end
if y < 9999999 && y >999999
ystr=num2str(y); %Paso el número a cadena
ystr=strcat('0',ystr); % Le añado un cero al principio de la cadena.
d1=ystr(3:6); %Obtengo los 4 dígitos centrales
end
if y > 99999 && y < 999999
ystr=num2str(y); %Paso el número a cadena
d1=ystr(2:5); %Obtengo los 4 dígitos centrales
end
if y < 99999 && y >9999
ystr=num2str(y); %Paso el número a cadena
ystr=strcat('0',ystr); % Le añado un cero al principio de la cadena.
d1=ystr(2:5); %Obtengo los 4 dígitos centrales
end
if y > 999 && y < 10000
ystr=num2str(y); %Paso el número a cadena
d1=ystr(1:4); %Obtengo los 4 dígitos centrales
end
if y < 1000
fprintf('Imposible continuar \n');
break;
end
u1=str2num(d1); %Convierto la cadena a número
x0=u1; %guardo la siguiente semilla.
u1=u1/10000; %Divido para obtener el número aleatorio entre 0 y 1
fprintf('%6.0f %6.0f\t %2.4f\n',i,x0,u1);
end

You might also like