Pascal/Turbo Pascal - Ayuda con numeros aleatorios mixto

 
Vista:

Ayuda con numeros aleatorios mixto

Publicado por Andrea Guevara (16 intervenciones) el 07/12/2012 06:54:25
Buenas, tengo que sacar un numero aleatorio, no nos dejan utilizar el random y por eso nos mandan a utilizar el metodo de congruencial mixto, pero si nos dejan utilizar el random para generar la semilla, por lo tanto se me ocurrio que podia sacar una funcion para la semilla y otro para generar el numero aletorio ya con la semilla generada, es decir, una funcion dentro de otra funcion, pero tambien vi que a lo mejor podia hacer todo el procedimiento dento de una funcion, pero yo no tengo claro el uso de las variables y los parametros por eso tiendo a confundirme mucho. Para quienes no recuerdan este es el congruencial mixto.

Congruencial Mixto

Los generadores congruenciales lineales generan una secuencia de numero pseudoaleatorios en la cual el próximo numero pseudoaleatorios es determinado a partir del numero generado, es decir el numero pseudoaleatorios Xn+1 es derivado a partir del numero pseudoaleatorios Xn
Para el caso particular del generador Congruencial mixto, la relación de decurrencia es la siguiente:

Xn+1 =( aXn + C) mod m

Donde:
X0 = la semilla (X0 > 0)
a= el multiplicador (a>0)
c= constante aditiva (c>0)
m= el modulo (m>X0 , m>a y m>c)

Esta relación de recurrencia nos dice que Xn+1 es el residuo de dividir aXn + c entre el modulo.
Veamos el siguiente ejemplo:

Generar 2 números aleatorios de modulo 8 con constantes a= 5 y c=7 y una semilla x0 = 4.
XN+1= (5XN + 7)(MODULO 8)

X1= 27 MODULO 8= 3
X2=22 MODULO 8= 6

Este es el codigo que pude sacar, me gustaria si me pudieran corregir y ayudarme. La idea de esto, es sacar dos numeros aletorios enteros por esta formula, Xn+1 =( aXn + C) mod m porque a pesar que salgan muchos numeros voy a tomar en cuenta son los dos primeros que salgan.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
program numero_aleatorio;
uses crt;
var
n_a:integer;
function numero(var i:integer; n_a:integer):real;
Const
	a=20;
	c=80;
	m=1000;
Begin
 
 randomize;
 i:=random (10)+1;
	repeat
		begin
			n_a:=(a*i+c)mod m;  {formula del metodo mixto}
			Writeln(n_a)
			i=n_a 			{Ahora i toma el valor de n_a para la siguiente vuelta}
		end;
	until(n_a=i)			{Hasta que n_a sea igual a la semilla se parara el ciclo}
End;
 
BEGIN
numero(n_a);
readkey;
END.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con numeros aleatorios mixto

Publicado por ramon (2158 intervenciones) el 07/12/2012 22:04:00
{A ver algo así}

program numero_aleatorio;
uses crt;
var
y, i, n_a : integer;


function numero : real;
Const
a = 20;
c = 80;
m = 1000;
Begin
i := random(10) + 1;
repeat
begin
n_a := (a * i + c) mod m; {formula del metodo mixto}
i := n_a; {Ahora i toma el valor de n_a para la siguiente vuelta}
end;
until(n_a = i); {Hasta que n_a sea igual a la semilla se parara el ciclo}
numero := n_a;
End;

BEGIN
clrscr;
randomize;
for y := 1 to 2 do
writeln(numero:0:0);
readkey;
END.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar