IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Faire un random sur une heure


Sujet :

Java

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut Faire un random sur une heure
    Bonjour,

    Je souhaite simuler des heures aléatoires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    			long minHour = LocalTime.of(00, 00).toSecondOfDay();
    			long maxHour = LocalTime.of(23, 55).toSecondOfDay();
    			long randomHour = ThreadLocalRandom.current().nextLong(minHour, maxHour);
    			LocalTime hour = LocalTime.ofSecondOfDay(randomHour).truncatedTo(ChronoUnit.MINUTES);
    Sauf que je voudrais que les minutes se termine par 0 ou 5

  2. #2
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 097
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
        public static void main(String[] args) {
            Random fonctionAleatoire = new Random();
            int heureAleatoire = fonctionAleatoire.nextInt(24);// Renverra un entier aléatoire compris entre 0 et 23 inclu.
            int minutes = fonctionAleatoire.nextInt(60);// Renverra un entier aléatoire compris entre 0 et 59 inclu.
            int secondes = definitPrecision(fonctionAleatoire.nextInt(60));
            LocalTime test = LocalTime.of(heureAleatoire, minutes, secondes);
            System.out.println(test);
            }
     
        private static int definitPrecision(int nextInt) {
            if (nextInt <=5) return 0;
            else {
                while (nextInt%5 != 0) nextInt++;
                if (nextInt == 60) nextInt = 59;
                return nextInt;
                }
            }
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    Par contre, je souhaite que les minutes se termine par 0 ou 5 seulement
    Par exemple, je veux générer une heure entre 9h00 et 10h30

  4. #4
    Membre Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 447
    Par défaut
    tu fais un nextInt(12) et tu fais * 5

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    Par exemple, je veux générer une heure entre 9h00 et 10h30

  6. #6
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Dans un jour, il y a 24 * 60 = 1440 minutes. Si tu voulais des heures à la minute pres, il suffirait de choisir un chiffre entre 0 et (1440 - 1). Mais comme tu veux une heure à 5 minutes pres, tu as 1440 / 5 = 288 possibilités. Il te suffit donc de choisir un chiffre entre 0 et 287.
    A partir du chiffre, pour connaitre l'heure : heures = chiffre / 12 (tronqué) et minutes = (chiffre % 12) * 5.
    A partir de l'heure, pour trouver le chiffre : chiffre = heures * 12 + (minutes / 5)

    Et voila

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    As-tu un exemple en java car j'ai pas vraiment compris

  8. #8
    Membre Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 447
    Par défaut
    dans une heure, t'as 60 minutes, si tu divises par 5 ça te fait 12, tu fais donc un random (12) qui te donne toutes les possibilités, puis tu fais * 5 pour les matérialiser sur une vraie heure

    exemple si tu random = 3 -> 3*5 ca fait 15, donc ça te fait heure / 15 minutes

  9. #9
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Bah je t'ai mis l'algo complet et il est plutot simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Random fonctionAleatoire = new Random();
    // La, c'est l'heure en chiffre
    int tempsChiffre= fonctionAleatoire.nextInt(288);
    int heures = tempsChiffre / 12;
    int minutes = (tempsChiffre % 12) * 5;
    Et le contraire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Random fonctionAleatoire = new Random();
    int heures = fonctionAleatoire.nextInt(24);
    // Pour les minutes, comme on veut des pas de 5 minutes, on prend un entier entre 0 et (60/5=12) puis on multiplie par 5
    int minutes = fonctionAleatoire.nextInt(12) * 5;
    int tempsChiffre= heures * 12 + (minutes / 5);

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    Sa marche !
    Par contre, il y a pas moyen de définir des bornes de début et de fin comme je l'ai dit sinon je doit faire un while tant que j'ai pas une heure qui correspond à mon créneau horaire

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    J'ai trouvé pour les bornes!
    Par contre ici:
    Dans un jour, il y a 24 * 60 = 1440 minutes. Si tu voulais des heures à la minute pres, il suffirait de choisir un chiffre entre 0 et (1440 - 1). Mais comme tu veux une heure à 5 minutes pres, tu as 1440 / 5 = 288 possibilités. Il te suffit donc de choisir un chiffre entre 0 et 287.


    Pour c'est 287 et non 288

  12. #12
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Le plus simple serait de déterminer combien il y a de minutes dans ton créneau horaire, et sélectionner au hasard un nombre de minutes, multiples de 5, de zéro au nombre max dans le créneau.

    Puis tu ajoutes ce nombre de minutes à l'heure de départ du créneau.

    Exemple :

    Je veux sélectionner un moment à la seconde près entre 15:20:00 et 16:40:00. Mais je ne veux que des multiples de 10 dans les secondes. Je ne veux pas 15:44:12 mais je veux bien 15:44:10.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // définir heures de début et fin
    LocalTime debut = LocalTime.of(15, 20, 0);
    LocalTime fin = LocalTime.of(16, 40, 0);
     
    // calculer nombre de secondes entre les deux
    int periodeEnSecondes = (int)ChronoUnit.SECONDS.between(debut, fin);
     
    // prendre un nombre de secondes au hasard, multiple de 10, de 0 au nombre entre les deux.
    int nbSecondes = random.nextInt(periodeEnSecondes/10)*10;
     
    // ajouter les secondes prises au hasard à la date de début
    LocalTime heureHasard = debut.plusSeconds(nbSecondes);
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par totot Voir le message
    Pour c'est 287 et non 288
    Parce que 0 donne minuit et 288 aussi. Il faut donc choisir entre 1 et 288 ou bien entre 0 et 287.

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    thelvin pour les minutes sa marche aussi? je multiplie par 5 ?

  15. #15
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Ben oui, suffit d'utiliser l'unité qu'on veut (minutes au lieu de secondes) et le multiple qu'on veut (5 au lieu de 10).

    Le code me semble tout de même assez simple à comprendre et à s'approprier. Normalement il n'y a rien dedans qui puisse ne pas être complètement évident.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Faire un undo sur une macro
    Par cbonnard dans le forum Général VBA
    Réponses: 15
    Dernier message: 19/10/2005, 18h19
  2. Faire un select sur une quantité défini d'élément
    Par tripper.dim dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/06/2005, 12h14
  3. Faire un Lock sur une table pendant l'exec d'un DTS
    Par Pete dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/03/2005, 15h17
  4. Selectionnet tous ou faire un clear sur une liste
    Par Canou dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/11/2004, 11h26
  5. Commande date. Faire des opération sur l'heure?
    Par fidififouille dans le forum Linux
    Réponses: 9
    Dernier message: 23/08/2004, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo