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

Langage PHP Discussion :

les microsecondes/millisecondes de js contre celles de PHP


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 275
    Points : 113
    Points
    113
    Par défaut les microsecondes/millisecondes de js contre celles de PHP
    Bonsoir,

    je converti un programme javascript en php !!
    voici le js ( oui je sais , il y a des var partout, mais ce n'est pas de moi !! ):
    Code javascript : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    var seed = Date.now();
     
    function valueOrDefault(value, defaultValue) {
        return typeof value === 'undefined' ? defaultValue : value;
    }
     
    function rand(min, max) {
        min = valueOrDefault(min, 0);
        max = valueOrDefault(max, 0);
        console.log(seed);
        seed = (seed * 9301 + 49297) % 233280;
        return min + (seed / 233280) * (max - min);
    }
     
    function numbers(config) {
        var cfg = config || {};
        var min = valueOrDefault(cfg.min, 0);
        var max = valueOrDefault(cfg.max, 100);
        var from = valueOrDefault(cfg.from, []);
        var count = valueOrDefault(cfg.count, 8);
        var decimals = valueOrDefault(cfg.decimals, 8);
        var continuity = valueOrDefault(cfg.continuity, 1);
        var dfactor = Math.pow(10, decimals) || 0;
        var data = [];
        var i, value;
     
        for (i = 0; i < count; ++i) {
            value = (from[i] || 0) + this.rand(min, max);
            if (this.rand() <= continuity) {
                data.push(Math.round(dfactor * value) / dfactor);
            } else {
                data.push(null);
            }
        }
        return data;
    }
    console.log(numbers({"min": -100, "max": 100, "count": 5}));

    le résultat: on voit que la valeur de _seed change ! ce sont des millisecondes ! ( on le voit au premier chiffre affiché )
    la valeur de this.rand(min, max) change à chaque itération.

    Du coup , ça retourne un tableau avec des valeurs différentes .

    Mais si je "traduit" en php ? comment avoir la même chose ? je ne trouve pas le moyen d'avoir le même résultat: la variable _seed ne change pas.
    Parce que les microseconde en PHP ...
    j'ai tenté un fonction:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function milliseconds() {
            $mt = explode(' ', microtime());
            return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
        }

    que j'appelle ensuite dans la fonction rand: $seed = $this->milliseconds(); mais il n'y a aucun changement
    Je ne voit pas comment faire .
    Si quelqu'un à une idée.
    Merci,

    Laurent.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 420
    Points : 15 789
    Points
    15 789
    Par défaut
    regardez le paramètre de la fonction, cela permet de retourner un nombre à virgule :
    https://www.php.net/manual/fr/function.microtime.php

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 275
    Points : 113
    Points
    113
    Par défaut
    Oui, alors du coup $seed = round(microtime(true)*1000);
    Mais ça ne règle pas le problème...j'obtiens toujours un tableau qui à 5 fois la même valeur , au lieu de 5 valeurs différentes !
    Pourquoi ça ne le ferait pas en PHP ? ( encore faut-il être sûr que j'aie bien compris le code javascript ).

    Comment faire pour afficher la valeur de seed à chaque itération ? Ça permettrait déjà de savoir si elle change, mais vu le résultat ça m'étonnerait.

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 420
    Points : 15 789
    Points
    15 789
    Par défaut
    montrez nous le code php que vous avez testé et le résultat que vous souhaitez obtenir.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 275
    Points : 113
    Points
    113
    Par défaut
    Je travaille avec Symfony !
    Code php : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    <?php
     
    namespace App\Controller;
     
    use Symfony\Component\Routing\Annotation\Route;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
     
    class RandomController extends AbstractController
    {
     
        public function milliseconds() {
            $mt = explode(' ', microtime());
            return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
        }
     
        public function rand(int $min=null, int $max=null) 
        {
            $seed = (int)round(microtime(true)*1000);
            $seed = ($seed * 9301 + 49297) % 233280;
            return $min + ($seed / 233280) * ($max - $min);
        }
     
        public function numbers( array $config) 
        {
            $cfg = $config != [] ? $config : [];
            $min = array_key_exists("min", $cfg) ? $cfg["min"] : 0;
            $max = array_key_exists("max", $cfg) ? $cfg["max"] : 100;
            $from = array_key_exists("from", $cfg) ? $cfg["from"] : [];
            $count = array_key_exists("count", $cfg) ? $cfg["count"] : 8;
            $decimals = array_key_exists("decimals", $cfg) ? $cfg["decimals"] : 8;
            $continuity = array_key_exists("continuity", $cfg) ? $cfg["continuity"] : 1;
            $dfactor = pow(10, $decimals);
            $data = [];
            $i = 0;
            $value = 0;
            for ($i = 0; $i < $count; ++$i) {
                // ($from == [] ? 0 : $from[$i])
                $value = $this->rand($min, $max);
                if ($this->rand() <= $continuity) {
                    $data[] = round($dfactor * $value) / $dfactor;
                } else {
                    $data[] = null;
                }
            }
            return $data;
        }
     
         /**
         * @Route("/stats/{count}/{max}/{min}", name="app_stats", methods={"GET"})
         *
         */
        public function stats(string $count, string $max, string $min)
        {
     
            $number_cfg = [];
            $number_cfg["count"] = (int)$count;
            $number_cfg["min"] = (int)$min;
            $number_cfg["max"] = (int)$max;
            $data = $this->numbers($number_cfg);
     
            return $this->json([$data]);
        }
    }

    Pour l'instant je ne renseigne que les variables $count, $min, $max

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 420
    Points : 15 789
    Points
    15 789
    Par défaut
    à chaque appel de "rand", vous mettez la même valeur dans "seed" donc c'est pour ça que vous avez plusieurs fois la même valeur.
    dans le code javascript, la variable "seed" est initialisée une fois au début. pour faire la même chose vous pouvez définir "seed" comme un attribut de la classe ou de l'objet.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 275
    Points : 113
    Points
    113
    Par défaut
    Bonjour,

    Je voudrais déjà être sûr que j'ai bien compris comment fonctionne le javascript !
    Si mon tableau data contient 5 valeurs différentes, c'est que la valeurs de value change à chaque itération.
    Ce qui implique que la valeurs de this.rand(min, max) change.
    Puisque min et max sont fixés alors seule la valeur de seed change à chaque itération.
    Déjà, j'ai du mal à comprendre pourquoi elle change si elle n'est initialisée qu'au début et une seule fois !

    Je mets seed dans la fonction rand , car justement elle est rappelée et réinitialisée à chaque itération.
    Et puisque ce sont des millisecondes, je pensais que la valeur changeait à chaque fois !

    Alors ceci donne le bon résultat:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public $seed;
     
        public function __construct()
        {
            $this->seed = (int)round(microtime(true)*1000);
        }

    avec derrière des $this->seed à la place des $seed Et je vous remercie pour la solution

    Mais je ne comprends pas comment la variable seed prend une nouvelle valeur à chaque itération
    Ce qui était peut-être mon vrai problème au départ !

  8. #8
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 420
    Points : 15 789
    Points
    15 789
    Par défaut
    Citation Envoyé par Ushuango Voir le message
    Déjà, j'ai du mal à comprendre pourquoi elle change si elle n'est initialisée qu'au début et une seule fois !
    c'est plus une question pour le forum javascript mais je vais essayer de résumer.
    en javascript les variables sont "globales", ce qui veut dire que dans la fonction rand, il y a la ligne seed = (seed * 9301 + 49297) % 233280; qui modifie la variable seed qui a été initialisée dans le contexte du niveau au dessus.

    Citation Envoyé par Ushuango Voir le message
    Et puisque ce sont des millisecondes, je pensais que la valeur changeait à chaque fois !
    les ordinateurs actuels sont très rapides (et les serveurs professionnels encore plus) donc il peut se passer beaucoup de chose en 1 ms. et donc la fonction peut être appelée plusieurs fois pendant la même milliseconde ce qui donne le résultat que vous avez observé.

  9. #9
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 420
    Points : 15 789
    Points
    15 789
    Par défaut
    je viens de penser que vous avez demandé une question de code sans parlé du but recherché donc j'ai l'impression qu'on est tombé dans un problème X/Y.

    si vous voulez générer un nombre aléatoire entre 2 bornes, il y a cette fonction en PHP :
    https://www.php.net/manual/fr/function.mt-rand.php

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/08/2009, 18h59
  2. Réponses: 2
    Dernier message: 27/01/2009, 15h50
  3. Réponses: 4
    Dernier message: 13/01/2009, 18h33
  4. Récupérer les microsecondes de l'instant présent
    Par LA GLOBULE dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 25/09/2006, 20h19
  5. Afficher les microsecondes ??
    Par haffouff dans le forum Langage
    Réponses: 1
    Dernier message: 13/06/2006, 12h29

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