import random as rd
import numpy as np
# Q1
def generate_random():
    return rd.randrange(-1, 2, 2) #retourne un nombre entre 1 et 2 avec une probabilité de 1/2

# Q2 et Q3
    
def position_pendant_marche(n):
    pos = [0]                        #initialisation de la liste position
    for i in range(n):              #boucle avec le nombre de marche choisi
        pos.append(pos[-1] + generate_random())     #on ajoute la position i à la liste position
    # print(f"Position parcourues : {pos}")
    # print(f"Position finale : {pos[-1]}")
    # print(f"Nombre de passage par 0 : {pos.count(0)}")
    # print(f"Valeur maximale atteinte : {max(pos)}")
    return pos

# Génération de marches différentes:
n = np.arange(5, 1000, 5)
un_tableau = []

for i in n:
    pos = position_pendant_marche(i)            
    nbr_zero, pos_max = pos.count(0), max(pos)  
    un_tableau.append([i, nbr_zero, pos_max])   

# Q4
#calcul des valeurs moyenne pour 1000, 10000, 100000 étapes
moyenne1000 = np.mean(position_pendant_marche(1000))
moyenne10000 = np.mean(position_pendant_marche(10000))
moyenne100000 = np.mean(position_pendant_marche(100000))
# Les valeurs sont proches de 0 comparativement au nombre de pas de la marche.

# Q5
def generate_deplacement_2d():
    """On choisit un nombre aléatoirement entre 0 et 4, à chaque nombre on associe un déplacement d'un pas dans l'une des 4 directions

    Returns:
        list: un déplacement
    """
    rand = rd.randrange(0, 4, 1)    #Choix du nombre entre 0 et 4
    if rand == 0:
        return [1, 0]               #On associe à 0 un déplacement de 1 sur x et 0 sur y
    elif rand == 1:
        return [0, 1]
    elif rand == 2:
        return [-1, 0]
    elif rand == 3 : 
        return [0, -1]

def marche_2d(n):
    """Déplacement de n pas sur une grille en deux dimensions

    Args:
        n (int): nombre de pas de la marche

    Returns:
        list: position à la fin du déplacement
    """
    pos = [[0, 0]]          #initialisation de la position initiale
    for i in range(n):                                          
        old_pos = pos[-1]
        depl = generate_deplacement_2d()                            #on génère un déplacement aléatoirement
        new_pos = [old_pos[0] + depl[0], old_pos[1] + depl[1]]      #on additionne le déplacement aux anciennes coordonnées
        pos.append(new_pos)                                         #on rafraichit la liste
    return pos

# Q6
def marche_2d_retour():
    """On modifie la fonction marche_2d(n) pour l'arrêter dès que le déplacement repasse par les coordonnées (0,0)

    Returns:
        list: liste contenant toutes les étapes du déplacement
    """
    pos = [[0, 0]]
    debut = True
    while pos[-1] != [0, 0] or debut == True:       #condition d'arrêt: arrêt si la dernioère position ajoutée est (0,0)
        debut = False
        old_pos = pos[-1]
        depl = generate_deplacement_2d()
        new_pos = [old_pos[0] + depl[0], old_pos[1] + depl[1]]
        pos.append(new_pos)
    return pos

print(f"Nombre d'étapes avant de repasser à (0,0):{ len(marche_2d_retour())}")