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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 280
    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 confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 714
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 714
    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 éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 280
    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 confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 714
    Détails du profil
    Informations personnelles :
    Localisation : France

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

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 280
    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 confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 714
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 714
    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.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/08/2009, 19h59
  2. Réponses: 2
    Dernier message: 27/01/2009, 16h50
  3. Réponses: 4
    Dernier message: 13/01/2009, 19h33
  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, 21h19
  5. Afficher les microsecondes ??
    Par haffouff dans le forum Langage
    Réponses: 1
    Dernier message: 13/06/2006, 13h29

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