Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment faire pour générer des heures dans l'ordre

Python 3.4

Sujet résolu
    30 septembre 2015 à 12:56:06

    Bonjours tout le monde,

    J'essaye de faire un programme qui génère des heures et des minutes aléatoirement mais dans un ordre chronologiques et différent.

    Malheureusement lorsque je lance mon programme il y a ceci qui s'affiche :

    Les heures sont différentes mais dans un ordre aléatoire.

    Je suis nouveau sur python et j'aimerai bien avoir un petit coup de main.

    voici mon code :

    Ps : Je demande de l'aide pas de me créer le programme :)

    -
    Edité par nnnnjjjjj 30 septembre 2015 à 13:17:58

    • Partager sur Facebook
    • Partager sur Twitter
      30 septembre 2015 à 14:15:50

      Utilise les balises de code stp!

      Tu peux calculer le nombre de minutes qui séparent l'heure de fin de l'heure d'arrivée. Ensuite tu choisis la quantité voulue de nombre aléatoires de minutes que tu stockes dans une liste. Tu tries cette liste et finalement tu ajoutes ces minutes à l'heure de départ, en prenant soin de recalculer correctement les heures. C'est assez facile vue que

      >>> min_total = 534
      >>> hours = min_total // 60
      >>> min = min_total % 60
      >>> hours, min
      (8, 54)
      

      Sinon tu peux jeter un oeil du côté du module datetime. Tu devras créer deux objets datetime pour l'heure de sortie et d'arrivée. Tu créeras un objet deltatime pour la différence entre les deux. Cet objet te dira combien de secondes il y a. Tu choisis à nouveau aléatoirement plusieurs nombre de secondes et tu crées de nouveaux deltatime. Tu ajoutes ces deltatime à ton datetime de départ et tu tries le tout.

      -
      Edité par Dan737 30 septembre 2015 à 14:31:52

      • Partager sur Facebook
      • Partager sur Twitter
        30 septembre 2015 à 14:22:25

        Salut,

        Bon déjà, la prochaine fois, utilise les balises codes </> du site histoire de poster du code que l'on peut copier coller ^^

        Tu as pas mal de truc que je ne comprends pas dans ton script ^^

        Déjà, tu ne devrais pas calculer les heures et les minutes séparément, tu devrais faire une seule variable minutes et calculer les heures à partir de cette variable. (Genre tu fais une fonction pour t'afficher ta variable en heure:minutes)

        Voilà le pseudo code que tu devrais utiliser :

        #définition des variables
        heure_arrivee = xx; # donné en minutes
        heure_sortie = yy; # donné en minutes
        
        seed = input(); # Je ne comprends pas trop le but de ta variable seed, je crois que c'est le nombre d'évennement que ton script doit généré ? Dans ce cas ce n'est pas un seed  juste un nombre d'itérations
        
        lastEventTime = heure_arrivee # On set un délimiteur à l'heure d'arrivee
        for event in range(seed-2): # on enlève 2 au "seed" car on connaît l'arrivee et la sortie
           eventTime = rand(heure_arrivee, heure_sortie)
           while(eventTime <= lastEventTime): # Si on a généré un event inférieur ou égale au dernier, on recommence la génération
              eventTime = randint(heure_arrivee, heure_sortie) # On génère un nombre de minutes entre 09:00 et 18:00
           mise_en_forme(eventTime)
        print(heure_sortie)
        function mise_en_forme(minutes):
           hours = minutes / 60
           mins = minutes % 60
           print(hours + ":" + mins)




        -
        Edité par Rosetux 30 septembre 2015 à 14:27:13

        • Partager sur Facebook
        • Partager sur Twitter
        Louche et en chaleur qu'y disait - Tout le monde doit le savoir, l'avatar de Lorrio est une marmotte !! Partagez l'information
          30 septembre 2015 à 14:32:39

          Ah désolé les gars je suis nouveau sur ce forum :/

          Mais j'ai pensé à faire des listes mais le prof ne veut pas qu'on utilise de liste donc je me sens un peu con con moi qui programmait en c++ ...

          On ne peut pas non plus utiliser la fonction par défaut time :'(

          Et j'ai pensé à ton idée Rosetux.

          J'ai prédéfini une fonction qui calcul le temps mais je ne pense pas que ce soit nécessaire.

          Voici le code :

          from random import randint
          
          def temps (heure,minute):
              
              heure = randint(0,24)
              minute = randint(0,60)
          
              if minute == 60:
                  heure += 1
                  minute = 0
          
              if heure == 24:
                  heure = 0
              
              print(heure,":",minute)



          • Partager sur Facebook
          • Partager sur Twitter
            30 septembre 2015 à 14:35:28

            Mais si vous voulez je peux vous montrer les consignes de mon projet uniquement à titre visuel.

            Je ne vous demande pas de le créer pour moi ça jamais ! Mais pourriez vous me pister un peu que je puisse apprendre plus sur python car j'ai étudié le c++ depuis 5 ans donc il est difficile pour moi de passer d'un langage compilé et complexe mais structuré à un langage interprété qui ne possède pas d'accolade :(

            -
            Edité par nnnnjjjjj 4 octobre 2015 à 12:37:17

            • Partager sur Facebook
            • Partager sur Twitter
              30 septembre 2015 à 15:01:04

              Alors (Je risque d'être grilled je vais écrire un long message)

              Voilà un pseudo code un peu plus complet :

              ## Attention, ceci est du pseudo code, les syntaxes ne correspondent pas à un langage précis 
              
              function renderTime(minutes):
                 hours = int(minutes / 60) # On divise les minutes par 60 et les mettons dans un Integer pour éviter d'avoir une virgule
                 mins = minutes % 60
                 return hours + ":" + mins
                 
              function main():
                 startTime = 9 * 60
                 endTime = 18 * 60
                 
                 nbBreak = int(input())
                 
                 lastBreak = startTime
                 lastBossComing = 0
                 for(break in range(nbBreak)):
                    breakStart = rand(startTime, endTime)
              	  breakEnd = breakStart + 50
              	  
              	  while(breakStart <= lastBreak && breakEnd >= endTime):
              	     breakStart = rand(startTime, endTime)
              		 breakEnd = breakStart + 50
              	  
              	  prob = rand(1, 3)
              	  if(prob == 1):
              	     timeOfWarning = rand(breakStart, breakEnd)
              		 timeOfBossComing = timeOfWarning + 60
              		 if(timeOfBossComing - lastBossComing >= 90):
              		    switch(breakEnd - timeOfBossComing):
              			   case < 20:
              			      # Gaston travail
              			   break
              			   
              			   case >= 20 && < 39:
                                # Gaston fait une sieste de 20 minutes puis travail
                             break
              
                             case >= 40 && < 49:
                                # Gaston fait deux sieste de 20 minutes puis travail
                             break
              
                             case >= 50:
                                # Ce cas ne peut pas arrivé en théorie
                             break
              			lastBossComing = timeOfBossComing
              	

              J'ai peu commenté pour que tu ais quand même du boulot à comprendre comment ça marche ^_^

              -
              Edité par Rosetux 30 septembre 2015 à 15:02:22

              • Partager sur Facebook
              • Partager sur Twitter
              Louche et en chaleur qu'y disait - Tout le monde doit le savoir, l'avatar de Lorrio est une marmotte !! Partagez l'information
                30 septembre 2015 à 16:59:23

                Rosetux a écrit:

                Alors (Je risque d'être grilled je vais écrire un long message)

                Voilà un pseudo code un peu plus complet :

                ## Attention, ceci est du pseudo code, les syntaxes ne correspondent pas à un langage précis 
                
                function renderTime(minutes):
                   hours = int(minutes / 60) # On divise les minutes par 60 et les mettons dans un Integer pour éviter d'avoir une virgule
                   mins = minutes % 60
                   return hours + ":" + mins
                   
                function main():
                   startTime = 9 * 60
                   endTime = 18 * 60
                   
                   nbBreak = int(input())
                   
                   lastBreak = startTime
                   lastBossComing = 0
                   for(break in range(nbBreak)):
                      breakStart = rand(startTime, endTime)
                	  breakEnd = breakStart + 50
                	  
                	  while(breakStart <= lastBreak && breakEnd >= endTime):
                	     breakStart = rand(startTime, endTime)
                		 breakEnd = breakStart + 50
                	  
                	  prob = rand(1, 3)
                	  if(prob == 1):
                	     timeOfWarning = rand(breakStart, breakEnd)
                		 timeOfBossComing = timeOfWarning + 60
                		 if(timeOfBossComing - lastBossComing >= 90):
                		    switch(breakEnd - timeOfBossComing):
                			   case < 20:
                			      # Gaston travail
                			   break
                			   
                			   case >= 20 && < 39:
                                  # Gaston fait une sieste de 20 minutes puis travail
                               break
                
                               case >= 40 && < 49:
                                  # Gaston fait deux sieste de 20 minutes puis travail
                               break
                
                               case >= 50:
                                  # Ce cas ne peut pas arrivé en théorie
                               break
                			lastBossComing = timeOfBossComing
                	

                J'ai peu commenté pour que tu ais quand même du boulot à comprendre comment ça marche ^_^

                Excuse-moi j'ai plus ou moins comprit ton idée et j'ai d'ailleurs déjà changé quelques variables etc ...

                Mais je ne comprend pas la partie du bas. Peux tu m'éclairer s'il te plait ?

                code :

                from random import randint,seed
                 
                heures = int(minutes / 60) # On divise les minutes par 60 et les mettons dans un Integer pour éviter d'avoir une virgule
                minutes = minutes % 60
                return (heures + ":" + minutes)
                    
                heure_arrive = 9 * 60
                heure_fin = 18 * 60
                    
                nbBreak = int(input()) #Je ne comprend pas est ce le seed ? 
                    
                
                lastBossComing = 0 #Pourquoi ?
                
                for Break in range(nbBreak):
                      breakStart = rand(heure_arrive,heure_fin)
                      breakEnd = breakStart + 50
                       
                      while(breakStart <= heure_arrive and breakEnd >= heure_fin):
                         breakStart = randint(startTime, endTime)
                         breakEnd = breakStart + 50
                       
                      prob = randint(1, 3) #variable prob doit être défini avant l'utilisation
                      if(prob == 1):
                         timeOfWarning = randint(breakStart,breakEnd)
                         timeOfBossComing = timeOfWarning + 60
                         if(timeOfBossComing >=90 and lastBossComing >= 90):
                            switch(breakEnd - timeOfBossComing): #Que signifie ceci ? 
                               case < 20:
                                  # Gaston travail
                               break
                                
                               case >= 20 && < 39:
                                  # Gaston fait une sieste de 20 minutes puis travail
                               break
                 
                               case >= 40 && < 49:
                                  # Gaston fait deux sieste de 20 minutes puis travail
                               break
                 
                               case >= 50:
                                  # Ce cas ne peut pas arrivé en théorie
                               break
                            lastBossComing = timeOfBossComing



                -
                Edité par nnnnjjjjj 30 septembre 2015 à 17:00:19

                • Partager sur Facebook
                • Partager sur Twitter
                  30 septembre 2015 à 17:03:25

                  Salut,

                  nbBreak c'est le seed ouaip :D Soit le nombre de pause.

                  Pour la probabilité, c'est simple, on génère un nombre entre 1 et 3 compris, et on ne fait venir le patron que si c'est 1 soit 1 fois sur 3.

                  Qu'est-ce que tu ne comprends pas vis à vis du switch ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Louche et en chaleur qu'y disait - Tout le monde doit le savoir, l'avatar de Lorrio est une marmotte !! Partagez l'information
                    30 septembre 2015 à 17:20:30

                    Et bien je ne comprend pas à quoi cela peut correspondre car même python ne reconnait pas la syntaxe de ce fait je me demande à quoi cela correspondrait.

                    Mais sinon merci de tes réponses cela me fait plaisir que tu prenne de ton temps pour m'aider :D

                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 septembre 2015 à 17:24:20

                      C'est la même chose qu'un if elseif elseif elseif, en effet python ne connaît pas les switch.

                      En gros, c'est un 

                      if breakEnd - timeOfBossComing < 20:
                      
                      else if breakEnd - timeOfBossComing >= 20 and breakEnd - timeOfBossComing < 39:
                      
                      else if ....:
                      
                      ...



                      • Partager sur Facebook
                      • Partager sur Twitter
                      Louche et en chaleur qu'y disait - Tout le monde doit le savoir, l'avatar de Lorrio est une marmotte !! Partagez l'information
                        30 septembre 2015 à 17:45:32

                        Ah d'accord malheureusement j'ai un soucis d'indentation maintenant ... je regrette la belle époque ou je pouvais mettre des accolades :'(

                        Par contre je me demandais comment je vais m'y prendre pour dire au programme de compter le nombre d'heure de boulot ...

                        je pourrai créer une variable que je nommerai compteur mais comment m'y prendre de plus le code manque de variable je pense mis a part la fonction print qui est relativement facilement à rajouter peux tu me guider un peu par rapport à ce code ci avec mes variables ?

                        code :

                        from random import randint,seed
                         
                        heures = int(minutes / 60) # On divise les minutes par 60 et les mettons dans un Integer pour éviter d'avoir une virgule
                        minutes = minutes % 60
                        return (heures + ":" + minutes)
                            
                        heure_arrive = 9 * 60
                        heure_fin = 18 * 60
                            
                        nbrseed = int(input("Entrez la seed:")) #Je ne comprend pas est ce le seed ? 
                            
                        
                        lastBossComing = 0 #Pas vraiment utile ? 
                        
                        for Break in range(nbrseed):
                            breakStart = rand(heure_arrive,heure_fin)
                            breakEnd = breakStart + 50
                               
                            while(breakStart <= heure_arrive and breakEnd >= heure_fin):
                                breakStart = randint(startTime, endTime)
                                breakEnd = breakStart + 50
                               
                            prob = randint(1, 3) 
                            if(prob == 1):
                                timeOfWarning = randint(breakStart,breakEnd)
                                timeOfBossComing = timeOfWarning + 60
                                if(timeOfBossComing >=90 and lastBossComing >= 90):
                                    if breakEnd - timeOfBossComing < 20:
                                          # Gaston travail
                                        
                                    elif breakEnd - timeOfBossComing >= 20 and breakEnd - timeOfBossComing < 39: #soucis d'indentaion rolala
                                          # Gaston fait une sieste de 20 minutes puis travail
                                       
                         
                                    elif breakEnd - timeOfBossComing >= 40 and breakEnd - timeOfBossComing < 49:
                                          # Gaston fait deux sieste de 20 minutes puis travail
                                       
                         
                                    elif breakEnd - timeOfBossComing >= 50:
                                          # Ce cas ne peut pas arrivé en théorie
                                       
                                    lastBossComing = timeOfBossComing #on pourait tout simplement mettre timeOfBossComing = 0
                        



                        -
                        Edité par nnnnjjjjj 30 septembre 2015 à 18:06:44

                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 septembre 2015 à 20:19:26

                          Tu dois d'abord réfléchir à ton modèle, c'est à dire comment tu vas représenter ce problème. Comme Rosetux l'a déjà mentionné, il serait plus judicieux de réfléchir en terme de minutes après l'heure de départ. D'ailleurs si tu y réfléchis bien, c'est comme si il commençait à la minute 0 et terminait sa journée à la minute (18 - 9) * 60 = 540. Si on appelle cela current_time, alors tu peux trouver à tout moment l'heure actuelle comme Rosetux t'a montré:

                          START_TIME = 9
                          current_hour = current_time // 60 + START_TIME
                          current_min = current_time % 60
                          
                          Petit bonus, tu peux afficher l'heure dans un format adéquat comme ceci:
                          "{:02}:{:02}".format(current_hour , current_min )
                          

                          Ca permet de mettre d'office 2 chiffres, en remplissant avec des 0 devant quand la variable ne contient qu'un nombre à 1 chiffre.

                          Tu auras besoin de plusieurs autres variables: le temps que Gaston travaille effectivement, le temps qu'il faut à Prunelle pour arriver et une variable pour savoir s'il est actuellement dans le bureau.

                          -
                          Edité par Dan737 30 septembre 2015 à 20:31:55

                          • Partager sur Facebook
                          • Partager sur Twitter
                            1 octobre 2015 à 18:25:21

                            Ah d'accord mais je me demandais pour la condition que le patron soit la est ce que je dois introduire ma variable annonce_message dans la while ou je peux l'introduire au debut après l'importation de la bibliothèque random ?
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Comment faire pour générer des heures dans l'ordre

                            × 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