Codificacion de Python

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 5

1.

- a) Utilizando el método no congruencial de cuadrados medios determinar el periodo de la


siguiente semilla 8066 (realice el cálculo de los 15 primeros números de manera manual y para
determinar el periodo o si se degenera impleméntelo en un lenguaje de programación) (25 pto.)
def cuadrados_medios(seed, n):
result = []
for i in range(n):
# elevar al cuadrado la semilla y obtener el número de 8 dígitos
squared = seed ** 2
num_str = str(squared).zfill(8)
# tomar los dígitos centrales como el siguiente número de la secuencia
next_num = int(num_str[2:6])
result.append(next_num)
# actualizar la semilla para el siguiente número
seed = next_num
return result

# Ejemplo de uso
print(cuadrados_medios(8066, 15))

b) Utilizando el método no congruencial de producto medios determinar el periodo de las siguientes


semillas: X0=90855 y X1=19876 (realice el cálculo de los 15 primeros números de manera manual y
para determinar el periodo o si se degenera impleméntelo en un lenguaje de programación) (25 pto.)
def producto_medios(x0, x1, m, n):
"""
Genera n números pseudoaleatorios utilizando el método de producto medios.
Retorna la secuencia generada y el periodo si se encontró uno, o None si el método se ha
degenerado.
"""
# Verificar que las semillas sean diferentes y estén dentro del rango [0, m)
if x0 == x1 or x0 >= m or x1 >= m:
print("Error: Las semillas deben ser diferentes y estar dentro del rango [0, m).")
return None, None
# Verificar que m sea mayor que 0
if m <= 0:
print("Error: m debe ser mayor que 0.")
return None, None

# Generar los primeros 2 números pseudoaleatorios


xi_minus_1 = x0
xi = x1
seq = [x0, x1]

# Ejecutar la fórmula muchas veces y buscar una secuencia repetitiva


i=2
while i < n:
xi_plus_1 = (xi * xi_minus_1) % m
if xi_plus_1 in seq and xi in seq:
periodo = i - seq.index(xi_plus_1) - 1
print(f"Se encontró una secuencia repetitiva en la iteración {i}. El periodo es {periodo}.")
return seq, periodo
seq.append(xi_plus_1)
xi_minus_1 = xi
xi = xi_plus_1
i += 1

# Si no se encontró una secuencia repetitiva, el método se ha degenerado


print("El método se ha degenerado.")
return seq, None

# Ejemplo de uso
x0 = 90855
x1 = 19876
m = 10**5
n = 1000
seq, periodo = producto_medios(x0, x1, m, n)
print("Secuencia generada:", seq)
if periodo:
print("Periodo:", periodo)
2.- a) Mediante el método congruencial algoritmo lineal genere manualmente exactamente 16
números pseudoaleatorios, posteriormente manteniendo los mismos parámetros excepto g, genere
en un lenguaje de programación 256 números pseudoaleatorios (25 pto)
import random

def congruential_linear_generator(m, a, c, x0, n):


"""
Genera n numeros pseudoaleatorios mediante el metodo del generador lineal congruente.

Parametros:
- m: el modulo ( un entero positivo).
- a: el multiplicador ( un entero positivo menor que m).
- c: la constante aditiva( un entero no negativo menor que m).
- x0: la semilla ( un entero no negativo menor que m).
- n: el numero de numeros pseudolaeatorios a generar.

Devoluciones:
- Una lista de n numeros pseudoaleatorios.
"""
results = []
x = x0
for i in range(n):
x = (a * x + c) % m
results.append(x)
return results
def main():
# Generate 16 numero psuedoaleatorios con los parametros dados.
m = 17
a=5
c=0
x0 = 3
n = 16
g = random.randint(1, m-1)

results1 = congruential_linear_generator(m, a, c, x0, n)

# Generate 256 numeros pseudoaleatorios con los mismos parametros, excepto g.


a_new = a + g
results2 = congruential_linear_generator(m, a_new, c, x0, 256)

# impresion de resultados.
print("16 pseudo-random numbers:")
print(results1)
print("256 pseudo-random numbers:")
print(results2)

if __name__ == "__main__":
main()
b) Mediante el método congruencial algoritmo multiplicativo genere manualmente exactamente 16
números pseudoaleatorios, posteriormente manteniendo los mismos parámetros excepto g, genere
en un lenguaje de programación 256 números pseudoaleatorios (25 pto)
# Generar 16 números pseudoaleatorios
def generar_16_numeros_pseudoaleatorios():
m = 16
a=5
x0 = 3
numeros = []
x = x0
for i in range(16):
x = (a * x) % m
numeros.append(x)
return numeros
print("Generamos los 16 numeros pseudoaleatorios")
print(generar_16_numeros_pseudoaleatorios())

# Generar 256 números pseudoaleatorios


def generar_256_numeros_pseudoaleatorios():
m = 16
a=5
x0 = 3
g=7
numeros = []
x = x0
for i in range(256):
x = (a * x + g) % m
numeros.append(x)
return numeros
print("generamos los 256 numeros pseudoaleatorios")
print(generar_256_numeros_pseudoaleatorios())
NOTA:
Para la pregunta 2, como la combinación de los parámetros para cada inciso es infinita, no se
calificará aquellas prácticas de diferentes estudiantes que tengan los mismos parámetros y números
aleatorios generados.

También podría gustarte