Partage
  • Partager sur Facebook
  • Partager sur Twitter

Choix aléatoire entre plusieurs fonctions ?

Sujet résolu
    16 janvier 2023 à 17:56:31

    Bonjour,

    Je cherche à lancer de manière aléatoire et répété (1 000 000 de fois) une fonction parmi deux (partie 1 ou partie 2).

    Mon code affiche une erreur à la dernière ligne au niveau du print.

    Pourriez vous m'éclairer svp ?

    import random
    Mise = 999
    Liste_choix = ["pile","face"]
    Jeux_A = 0
    Jeux_B = 0
    
    def partie1 () :
    	Jeux = random.choices (Liste_choix, weights=(0.49,0.51),k=1)
    	if Jeux == ["pile"] :
    		Mise += 1
    	else :
    		Mise -= 1
    
    
    def partie2 () :
    	if Mise%3==0 :
    		Jeux_A = random.choices (Liste_choix, weights=(0.09,0.91),k=1)
    		if Jeux_A == ["pile"] :
    			Mise += 1
    		else :
    			Mise -= 1
    	else :
    		Jeux_B = random.choices (Liste_choix, weights=(0.74,0.26),k=1)
    		if Jeux_B == ["pile"] :
    			Mise += 1
    		else :
    			Mise -= 1
    
    for i in range (1,1000000) :            
    	random.choice (partie1 (),partie2 ())
                
    print (Mise)



    • Partager sur Facebook
    • Partager sur Twitter
      16 janvier 2023 à 18:40:13

      Et quelle est l'erreur que tu reçois?
      D'abord, choice s'attend à recevoir un itérable comme argument.
      Ensuite Python s'attend à ce que tu donnes des arguments à tes fonctions. Je pense qu'il pense les trouver sur la ligne du print.
         random.choice( (partie1, partie2) ) ()

      choice choisit un objet de type "function" mais n'exécute pas la fonction.

      -
      Edité par PierrotLeFou 16 janvier 2023 à 19:15:45

      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        16 janvier 2023 à 19:55:05

        ton code est un peu l'équivalent à ci-dessous si je me trompe,

        import random
        
        mise = 999
        
        
        def head_or_tail(my_list, values): return random.choices(my_list, values, k=1)[0]
        
        
        def get_values():
            parts = {
                "parts_1": (0.49, 0.51),
                "parts_2": random.choice([(0.09, 0.91), (0.74, 0.26)])
            }
            return parts[random.choice(list(parts.keys()))]
        
        
        for _ in range(1, 1000000):
            if head_or_tail(["pile", "face"], get_values()) == "pile":
                mise += 1
            else:
                mise -= 1
        print(mise)
        



        -
        Edité par fred1599 16 janvier 2023 à 19:55:55

        • Partager sur Facebook
        • Partager sur Twitter

        Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
        La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        Anonyme
          16 janvier 2023 à 20:13:21

          Salut !

          Une manière de faire :

          import random
          Mise = 999
          Liste_choix = ["pile","face"]
          Jeux_A = 0
          Jeux_B = 0
           
          def partie1():
              global Mise
              Jeux = random.choices (Liste_choix, weights=(0.49,0.51),k=1)
              if Jeux == ["pile"] :
                  Mise += 1
              else :
                  Mise -= 1
           
           
          def partie2() :
              global Mise
              if Mise%3==0 :
                  Jeux_A = random.choices (Liste_choix, weights=(0.09,0.91),k=1)
                  if Jeux_A == ["pile"] :
                      Mise += 1
                  else :
                      Mise -= 1
              else :
                  Jeux_B = random.choices (Liste_choix, weights=(0.74,0.26),k=1)
                  if Jeux_B == ["pile"] :
                      Mise += 1
                  else :
                      Mise -= 1
           
          for i in range (1,1000000) :           
              random.choice((partie1,partie2))()
                       
          print(Mise)

          Sinon un peu plus pro et PEP friendly :

          import random
          
          mise = 999
          liste_choix = ["pile","face"]
           
          def partie(rd, mise) :
              if rd == 1:
                  weights = (0.49, 0.51)        
              else:
                  if mise%3!=0 :
                      weights = (0.74, 0.26)            
                  else :
                      weights = (0.09, 0.91)
          
              side = random.choices(liste_choix, weights=weights, k=1)[0]
              
              if side == "pile" :
                  return mise+1
              else :
                  return mise-1
          
          for i in range(1, 1000000) :           
              mise = partie(random.randint(1, 2), mise)
          
          print(mise)




          • Partager sur Facebook
          • Partager sur Twitter
            16 janvier 2023 à 20:46:34


            PierrotLeFou

            OK merci, à priori la fonction Global était manquante ?


            fred1599

            Merci Fred, un peu compliqué pour le débutant que je suis pour l'instant :-) merci je vais étudier ça



            ErispoeLeNarvalo a écrit:

            Salut !

            Une manière de faire :

            import random
            Mise = 999
            Liste_choix = ["pile","face"]
            Jeux_A = 0
            Jeux_B = 0
             
            def partie1():
                global Mise
                Jeux = random.choices (Liste_choix, weights=(0.49,0.51),k=1)
                if Jeux == ["pile"] :
                    Mise += 1
                else :
                    Mise -= 1
             
             
            def partie2() :
                global Mise
                if Mise%3==0 :
                    Jeux_A = random.choices (Liste_choix, weights=(0.09,0.91),k=1)
                    if Jeux_A == ["pile"] :
                        Mise += 1
                    else :
                        Mise -= 1
                else :
                    Jeux_B = random.choices (Liste_choix, weights=(0.74,0.26),k=1)
                    if Jeux_B == ["pile"] :
                        Mise += 1
                    else :
                        Mise -= 1
             
            for i in range (1,1000000) :           
                random.choice((partie1,partie2))()
                         
            print(Mise)

            Sinon un peu plus pro et PEP friendly :

            import random
            
            mise = 999
            liste_choix = ["pile","face"]
             
            def partie(rd, mise) :
                if rd == 1:
                    weights = (0.49, 0.51)        
                else:
                    if mise%3!=0 :
                        weights = (0.74, 0.26)            
                    else :
                        weights = (0.09, 0.91)
            
                side = random.choices(liste_choix, weights=weights, k=1)[0]
                
                if side == "pile" :
                    return mise+1
                else :
                    return mise-1
            
            for i in range(1, 1000000) :           
                mise = partie(random.randint(1, 2), mise)
            
            print(mise)




            ErispoeLeNarvalo

            Excellent, merci je prends dans un premier temps ta première proposition. Je découvre le fonction Global qui manquait à mon code. Top

            -
            Edité par r_naish 16 janvier 2023 à 22:40:43

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              16 janvier 2023 à 21:29:13

              Et oui il ne faut pas oublier la portée des variables !!!


              • Partager sur Facebook
              • Partager sur Twitter

              Choix aléatoire entre plusieurs fonctions ?

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown