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 :

Optimisation fonction random


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webmaster Freelance
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster Freelance

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 15
    Points
    15
    Par défaut Optimisation fonction random
    Bonjours, pour les besoins d'un projet personnel je doit générer aléatoirement un nombre donné de coordonnées du style x,y sur une grille de 500*500 (chaque case fait 10*10), mon soucis étant que chaque coordonnée x,y générée ne doit pas déjà avoir été générée auparavant au même coordonnées, je souhaite faire une sorte de random sélectif.

    J'ai codé le petit bout de code ci-dessous qui est fonctionnel, cependant si le nombre à générer devient important, php rame, cela est du je pense à ma boucle while, je souhaiterais donc savoir si il existe un moyen plus "propre" de faire cela, merci.

    Vous pouvez voir le résultat de la génération actuelle sur ce lien : http://waelin-chatbot.fr/simulation/

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    //Nombre de cases générées souhaité
    $nb = 10;
     
    //initialisation du tableau contenant les coordonnées des cases
    $tab = array();
     
     
    for($i = 1; $i <= $nb; $i++){
     
    	$x = rand(1,50);
    	$y = rand(1,50);
     
    	$coor = $x.','.$y;
    	$present = true;
     
    	while($present){
     
    		//Si $coor n'est pas présent dans $tab, on sort du while	
    		if(!in_array($coor, $tab)){ $present = false; }
     
    		//Si $present vaut toujours vrai, on régénère des coordonnées
    		//avant de repasser dans le while 	
    		if($present){
     
    			$x = rand(1,50);
    			$y = rand(1,50);
    			$coor = $x.','.$y;
    		}
    	}
     
    	//Ajout des coordonnées
    	$tab[] = $coor;
    }

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    in_array va etre lent sur de gros tableau.
    tu iras plus vite en utilisant les index de tableau :
    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
     
    $nb = 10;
     
    $tab = array();
     
    for($i = 1; $i <= $nb; $i++){
     
    	do {
    		$x = rand(1,50);
    		$y = rand(1,50);
    		$coor = $x.','.$y;
     
    	} while(isset($tab[$coor]))
     
            $tab[$coor] = TRUE;
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Homme Profil pro
    Webmaster Freelance
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster Freelance

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Salut sabotage, merci pour cette réponse

    j'ai regardé ton code et je comprends pas le "$tab[$coor] = TRUE;" à la ligne 15

    c'est seulement les coordonnés générés que je souhaite rajouter à mon tableau.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est seulement pour la boucle.
    Après tu fais $tab = array_keys($tab); pour remettre les index en valeurs.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre à l'essai
    Homme Profil pro
    Webmaster Freelance
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster Freelance

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Bien, je viens de tester, et PHP m'indique une erreur de syntaxe au niveau de la ligne 15 justement ><

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    pour gagner en perfs, essaie avec un in_array typé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( ! in_array($coor, $tab, true))
    En testant ton code tel quel avec $nb = 1000;, j'obtiens : 0,0835 s, juste en rajoutant le typage : 0,0143 s (5,9 fois plus rapide)

    Et en cherchant à optimiser dans ce genre :
    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
    18
    19
    20
    21
    22
    function random($nb)
    {
    $i  = -1;
     
        // initialisation du tableau contenant les coordonnées des cases
        $tab = array();
     
        $get_coord = function() { return rand(1, 50).','.rand(1, 50); };
     
        while (++$i < $nb)
        {
            $c = $get_coord();
            while (isset($tab[$c]))
            {
                $c = $get_coord();
            }
     
            $tab[$c] = true;
        }
     
        return array_keys($tab);
    }
    J'obtiens : 0.00165 s soit 51 fois plus rapide pour 1000 coordonnées

  7. #7
    Membre à l'essai
    Homme Profil pro
    Webmaster Freelance
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster Freelance

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Salut rawsrc, j'ai essayer ton code, alors effectivement sa semble bien plus rapide, cependant des que je dépasse les 1200/1300 le script se met a ramer et dépasse les 30s de php ...

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Quand tu as trouvé 1250 coordonnées, tu as 1 chance sur 2 de ne pas trouver une coordonnée libre sur le tirage.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre à l'essai
    Homme Profil pro
    Webmaster Freelance
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster Freelance

    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Ha ... sachant qu'il faut que j'en génère 2500 max différents pour remplir la grille sa ne conviendra pas ... je vais rester sur mon script de base qui fonctionne correctement pour 2500, je l'ai modifié en fonction de vos remarques pour améliorer la vitesse, sa suffira amplement pour le moment.

    Merci à vous pour vos propositions et vos idées

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu n'as pas suivi : Le problème est le même quelque soit la méthode utilisée. Plus tu as déjà trouvé d'éléments, plus il est dur d'en trouver un libre. Tu peux même chercher à l'infini même c'est si improbable.
    Mais sur 2500 éléments ça reste raisonnable.

    Pour revenir à notre script, avec la méthode qu'on te propose, il faut quelques centièmes de secondes pour remplir les 2500 cases de ta grille (0,02s en moyenne ici sur mon poste).
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. [Forth] Fonction random
    Par kamfezz dans le forum Autres langages
    Réponses: 3
    Dernier message: 16/04/2023, 14h33
  2. [Fortran 77] Fonction random
    Par ajsd0208 dans le forum Fortran
    Réponses: 1
    Dernier message: 15/07/2005, 12h58
  3. [LG]Utilisation de la fonction Random
    Par chloe95 dans le forum Langage
    Réponses: 1
    Dernier message: 01/03/2005, 14h20
  4. [LG]Fonction random
    Par platoon5 dans le forum Langage
    Réponses: 16
    Dernier message: 22/02/2005, 20h47
  5. Fonction Random en Assembleur
    Par chidi dans le forum Assembleur
    Réponses: 5
    Dernier message: 21/05/2004, 10h16

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