3×3 Montecarlo

Comenzamos llamando a las librerias

import numpy as np
from random import *

Encontramos un numero aleatorio entre el 1,2 o 3

aux1 = 3*random()
if aux1 > 0 and aux1<=1: aux2=1
if aux1 > 1 and aux1<=2: aux2=2
if aux1 > 2 and aux1<=3: aux2=3
print(aux2)

Es convniente crear una funcion que encapsule la determinacion del numero aleatorio

def random3():
 aux1 = 3*random()
 if aux1 > 0 and aux1<=1: aux2=1
 if aux1 > 1 and aux1<=2: aux2=2
 if aux1 > 2 and aux1<=3: aux2=3
 return aux2
print(random3())

Probamos a ver que tal funciona

for i in range(10):
 print(random3())

1
2
1
3
2
3
1
3
2
2

Ahora creamos una matriz de 3×3

A=np.zeros((3,3))
print(A)


[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]

La asignacion de elementos de matriz puede hacerse de la siguiente forma

A[0,0]=0
A[0,1]=1
A[0,2]=2

A[1,0]=3
A[1,1]=4
A[1,2]=5

A[2,0]=6
A[2,1]=7
A[2,2]=8
print(A)
[[0. 1. 2.]
 [3. 4. 5.]
 [6. 7. 8.]]




A continuacion, planteamos una propuesta de solucion aleatoria

A[0,0]=random3()
A[0,1]=random3()
A[0,2]=random3()

A[1,0]=random3()
A[1,1]=random3()
A[1,2]=random3()

A[2,0]=random3()
A[2,1]=random3()
A[2,2]=random3()
print(A)

[[3. 3. 2.]
 [1. 2. 2.]
 [1. 2. 3.]]

Una forma mas conpacta de crear una matriz aleatoria es

for i in range(3):
 for j in range(3):
  A[i,j]=random3() 
print(A)

[[2. 3. 2.]
 [3. 2. 3.]
 [3. 1. 1.]]

Tambien, para este caso es conveniente crear una funcion que cree una matriz aleatoria

def crea():
 for i in range(3):
  for j in range(3):
   A[i,j]=random3() 
 return A

A continuacion probamos la funcion de la siguiente forma

for i in range(5):
 A=crea()
 print(A)


[[2. 3. 2.]
 [1. 1. 2.]
 [3. 1. 2.]]
[[1. 3. 3.]
 [2. 1. 2.]
 [2. 3. 2.]]
[[3. 1. 2.]
 [2. 2. 1.]
 [1. 3. 3.]]
[[1. 3. 2.]
 [3. 3. 3.]
 [3. 2. 2.]]
[[3. 2. 3.]
 [3. 2. 3.]
 [1. 1. 3.]]

Para checar que una matriz A es solucion, planteamos

solucion = 1 # Es una bandera, solucion 1 se asume temporalmente que es solucion, 0 Se demuestra que NO es solucion

if solucion ==1:  # Checando el primer renglon...
 if A[0,0] == A[0,1] or A[0,0] == A[0,2] or A[0,1]==A[0,2]:
  print('Hay dos numeros iguales en el primer renglon')
  solucion = 0

if solucion ==1:  # Checando el segundo renglon...
 if A[1,0] == A[1,1] or A[1,0] == A[1,2] or A[1,1]==A[1,2]:
  print('Hay dos numeros iguales en el segundo renglon')
  solucion = 0

if solucion ==1:  # Checando el segundo renglon...
 if A[2,0] == A[2,1] or A[2,0] == A[2,2] or A[2,1]==A[2,2]:
  print('Hay dos numeros iguales en el tercer renglon')
  solucion = 0

if solucion ==1:  # Checando la primer columna...
 if A[0,0] == A[1,0] or A[0,0] == A[2,0] or A[1,0]==A[2,0]:
  print('Hay dos numeros iguales en la primer columna')
  solucion = 0

if solucion ==1:  # Checando la segunda columna...
 if A[0,1] == A[1,1] or A[0,1] == A[2,1] or A[1,1]==A[2,1]:
  print('Hay dos numeros iguales en la segunda columna')
  solucion = 0

if solucion ==1:  # Checando la tercer columna...
 if A[0,2] == A[1,2] or A[0,2] == A[2,2] or A[1,2]==A[2,2]:
  print('Hay dos numeros iguales en la tercer columna')
  solucion = 0

print(solucion) 

Es conveniente que este procedimiento de checar si una matriz A es solucion, se encapsule en una funcion, de la forma

def busca(A):
 solucion = 1 # Es una bandera, solucion 1 se asume temporalmente que es solucion, 0 Se demuestra que NO es solucion

 if solucion ==1:  # Checando el primer renglon...
  if A[0,0] == A[0,1] or A[0,0] == A[0,2] or A[0,1]==A[0,2]:
   print('Hay dos numeros iguales en el primer renglon')
   solucion = 0

 if solucion ==1:  # Checando el segundo renglon...
  if A[1,0] == A[1,1] or A[1,0] == A[1,2] or A[1,1]==A[1,2]:
   print('Hay dos numeros iguales en el segundo renglon')
   solucion = 0

 if solucion ==1:  # Checando el segundo renglon...
  if A[2,0] == A[2,1] or A[2,0] == A[2,2] or A[2,1]==A[2,2]:
   print('Hay dos numeros iguales en el tercer renglon')
   solucion = 0

 if solucion ==1:  # Checando la primer columna...
  if A[0,0] == A[1,0] or A[0,0] == A[2,0] or A[1,0]==A[2,0]:
   print('Hay dos numeros iguales en la primer columna')
   solucion = 0

 if solucion ==1:  # Checando la segunda columna...
  if A[0,1] == A[1,1] or A[0,1] == A[2,1] or A[1,1]==A[2,1]:
   print('Hay dos numeros iguales en la segunda columna')
   solucion = 0

 if solucion ==1:  # Checando la tercer columna...
  if A[0,2] == A[1,2] or A[0,2] == A[2,2] or A[1,2]==A[2,2]:
   print('Hay dos numeros iguales en la tercer columna')
   solucion = 0

 return solucion

Hacemos una prueba

z=busca(A)
print(A)
print(z)

Hacemos varias pruebas

for k in range(10):

 for i in range(3):
  for j in range(3):
   A[i,j]=random3() 

 print(A)

 z=busca(A)
 print(z)

for k in range(10):

 for i in range(3):
  for j in range(3):
   A[i,j]=random3() 

 print(A)

 z=busca(A)
 print(z)

[[1. 1. 1.]
 [1. 2. 3.]
 [1. 3. 3.]]
Hay dos numeros iguales en el primer renglon
0
[[3. 1. 2.]
 [3. 1. 3.]
 [1. 1. 1.]]
Hay dos numeros iguales en el segundo renglon
0
[[3. 1. 2.]
 [1. 1. 3.]
 [2. 2. 3.]]
Hay dos numeros iguales en el segundo renglon
0
[[2. 2. 1.]
 [1. 1. 1.]
 [2. 3. 3.]]
Hay dos numeros iguales en el primer renglon
0
[[2. 1. 2.]
 [3. 3. 1.]
 [2. 2. 1.]]
Hay dos numeros iguales en el primer renglon
0
[[2. 2. 3.]
 [1. 3. 2.]
 [3. 1. 2.]]
Hay dos numeros iguales en el primer renglon
0
[[3. 1. 1.]
 [3. 3. 2.]
 [1. 3. 2.]]
Hay dos numeros iguales en el primer renglon
0
[[3. 1. 1.]
 [2. 2. 2.]
 [2. 2. 1.]]
Hay dos numeros iguales en el primer renglon
0
[[3. 3. 3.]
 [2. 1. 3.]
 [1. 1. 2.]]
Hay dos numeros iguales en el primer renglon
0
[[2. 2. 2.]
 [1. 1. 2.]
 [1. 2. 2.]]
Hay dos numeros iguales en el primer renglon
0

Es conveniente reescribir la funcion busca() de forma que ya no arroje tanta informacion

def busca2(A):
 solucion = 1 # Es una bandera, solucion 1 se asume temporalmente que es solucion, 0 Se demuestra que NO es solucion

 if solucion ==1:  # Checando el primer renglon...
  if A[0,0] == A[0,1] or A[0,0] == A[0,2] or A[0,1]==A[0,2]:
   solucion = 0

 if solucion ==1:  # Checando el segundo renglon...
  if A[1,0] == A[1,1] or A[1,0] == A[1,2] or A[1,1]==A[1,2]:
   solucion = 0

 if solucion ==1:  # Checando el segundo renglon...
  if A[2,0] == A[2,1] or A[2,0] == A[2,2] or A[2,1]==A[2,2]:
   solucion = 0

 if solucion ==1:  # Checando la primer columna...
  if A[0,0] == A[1,0] or A[0,0] == A[2,0] or A[1,0]==A[2,0]:
   solucion = 0

 if solucion ==1:  # Checando la segunda columna...
  if A[0,1] == A[1,1] or A[0,1] == A[2,1] or A[1,1]==A[2,1]:
   solucion = 0

 if solucion ==1:  # Checando la tercer columna...
  if A[0,2] == A[1,2] or A[0,2] == A[2,2] or A[1,2]==A[2,2]:
   solucion = 0

 return solucion

hacemos una prueba

cuenta=0
N=1000
for k in range(N):
    
 for i in range(3):
  for j in range(3):
   A[i,j]=random3() 
   z2=busca2(A)
   if z2==1:
    print(z2,'una solucion')
    print(A)
    cuenta=cuenta+1
print(cuenta)

1 una solucion
[[3. 1. 2.]
 [2. 3. 1.]
 [1. 2. 3.]]
1 una solucion
[[3. 1. 2.]
 [2. 3. 1.]
 [1. 2. 3.]]
2

Como podemos checar que tenemos soluciones diferentes y ademas, guardarlas???

Una opcion puede ser

a = np.array([[1,2,3],[4,5,6]]) 

print('First array:') 
print(a) 
print('\n')  

print('Append elements to array:')
print(np.append(a, [7,8,9]))
print('\n')

print('Append elements along axis 0:') 
print(np.append(a, [[7,8,9]],axis = 0)) 
print('\n')  

print('Append elements along axis 1:')
print(np.append(a, [[5,5,5],[7,8,9]],axis = 1))