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

Contribuez / Téléchargez Sources et Outils PHP Discussion :

Génération de nombres aléatoires


Sujet :

Contribuez / Téléchargez Sources et Outils PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 57
    Points : 36
    Points
    36
    Par défaut Génération de nombres aléatoires
    Bonjour à tous

    étant actuellement charger en boulot je n ai pas eu trop le temps de me consacré au forum mais hier soir j ai eu un éclair de génie

    ce qui suit permet de choisir un nombre définit de chiffre aléatoire et différent.
    (donc si ça interesse quelqu'un ) PAR CONTRE Si vous l'utilisez citez moi dans vos projet seul obligation =).

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    /**
     * Description of TabHasard
     *date : 15/04/2011
     * descriptif : cette algorithme permet de génerer un tableau de 
     * chiffres différents et aléatoire
     * @author josselin54 , MadFrix
     */
     
     
    function mainHasard() // fonction qui génere le tableau de 10 
    {
        $tmp = 0;
        $fini = false;
        $tab = array(); // ne pas initialiser le tableau a la bonne taille !!!
        $limit = 11; // variable qui définit combien de id seront retourner dans le tableau
        $i=0;
     
        while($fini != true)
        {
            $tmp = generateHasard();
            if(count($tab)<$limit)
            {
                if($i<count($tab))
                {
                    if(!in_array($tmp, $tab))
                    {
                        $tab[$i] = $tmp;
                    }
                    $i++;
                }
                else
                {
                    $i=0;
                }
            }
            else
            {
                $fini = true;
            }
        }
     
         return $tab;
     
     
     
    }
     
    function generateHasard()
    {
     
       return round(1, 300); // par exemple
    }
    veuillez si vous l'utilisez mettre le commentaire en haut ça serait sympathique

  2. #2
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Bonjour,

    utilise in_array() plutôt que ta fonction existeInTab() et d'une façon plus générale, utilise une boucle foreach plutot que for pour itérer sur un tableau

    ++

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Merci pour le in_array() ça marche bien je perd en traitement =) mais dans ce cas foreach ne sers plus a rien =)

  4. #4
    Membre éprouvé Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2010
    Messages : 573
    Points : 915
    Points
    915
    Par défaut
    deja pour commencer à mon avis c'est rand(1, 300) et pas round(1, 300) et si tu testes ton script tu verras qu'il boucle à l'infini...
    $i est toujours égale à 0 et $i < count($tab) des le premier tour de boucle 0<0 = faux donc $i = 0 et rebelote...éclaire de génie à l'infini, euh je veux dire boucle à l'infini...
    Développeur informatique contrarié...

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    oui !!! hélas j'ai poster plus vite que mon ombre mon idée est pas mal mais ça boucle infini ......

    eh crotte

    je suis entrint de chercher comment faire pour créer ce petit algo mais je n'y arrive pas .... pour le moment.

  6. #6
    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
    Il y a de plus des problème de performance dans la logique de ton traitement

    1 - boucle while
    2 - tu tires un nombre
    3 - tu regardes la taille de ton tableau : donc si la taille est bonne, tu as tiré un chiffre pour rien
    4 - tu fais une deuxième une vérification de la taille (?)
    5 - tu regardes si ce chiffre avait déjà été tiré, si le chiffre a déjà été tiré, tu va recommencer la boucle et donc recompter deux fois la taille du tableau alors qu'elle n'a pas changé.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    non ? c'est vrai ? il marche pas tout simplement je pense !
    pis tout faut 4 -> $i<count(tab) je t'explique c'est pour éviter de faire un offset

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Josselin54 Voir le message
    non ? c'est vrai ? il marche pas tout simplement je pense !
    pis tout faut 4 -> $i<count(tab) je t'explique c'est pour éviter de faire un offset
    ==========================
    Réponse
    ==========================

    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
    34
    35
    36
    function mainHasard() // fonction qui génere le tableau de 10 id
    {
        $limite = 5;
        $tab = array();
        $i = 0;
        $tmp = 1;
     
        while($i<$limite)
        {
            $tmp = generateHasard($tmp);
            echo $tmp."<br>";
            if(!in_array($tmp, $tab))
           {
               echo $tmp."affecter<br/>";
                $tab[$i] = $tmp;
                $i++;
            }
        }
        return $tab;
     
    }
     
    function generateHasard($vardebut)
    {
     
     
     
        if($vardebut<15)
        {
        return rand($vardebut, 15);
        }
        else
        {
            return rand(1, 15);
        }
    }

  9. #9
    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
    Si on veut plus de 15 nombres, on tombe dans une boucle infinie.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    non suffit juste de remplacer 15 par ton max c'est tout
    j ai teste avec 300 en max avec un $limite de 25 ça prend un peu de temp mais ça marche très bien !

  11. #11
    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
    Certes mais c'est à ton code de prendre en compte ça.

    D'ailleurs je ne vois pas a quoi $vardebut, cela ralentit considérablement le traitement.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    problème posé : créer un tableau aléatoire sans redondance dans les valeurs.

    ne sachant pas a l'avance quel chiffre va tomber et Surtout quel chiffre est tomber $varDebut nous évite du traitements . ainsi on recoupe l'intervalle de valeur aléatoire.

    par exemple :

    au depart $vardebut prend 4
    donc 4 est tomber et il ne dois plus retomber
    donc rand prendera intervalle (4,15) comme ça on est a peu prés sure de pas l'avoir.

    $vardeubt prend ensuite 8
    donc 8 est tomber et il ne dois plus retomber
    donc rand prendera intervalle (8,15) comme ça on est a peu prés sure de pas l'avoir.

    ainsi de suite .

    mais si tu as mieu pour répondre a ce problème envoie le code =)

  13. #13
    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 fausses le hasard.
    exemple mon premier tirage est 13, mon second sera obligatoirement 14 ou 15 ; et si c'est 14, je suis sur de sortir le 15.
    Sur 5000 tirage j'ai sorti 95% de fois le 15.

    Le hasard fait déjà bien les choses et le script est plus performant.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    dans le tableau car MainHasard () retourne un tableau tu as combien de fois 15
    faut pas faire gaffe au truc qui s'affiche.

    pis n'oublie pas la condition dans GenerateHasard() on peut revenir en arrière.

    et si c'etait pas ça le hasard =) .

  15. #15
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Bonjour,

    y'a plus simple quand même

    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
    function nbAleatoires($nb, $offsetMin, $offsetMax){
     
    	$sortie = array();
    	$casPossibles = range($offsetMin, $offsetMax);
     
    	if(count($casPossibles) < $nb)
    		return false;
     
    	while($nb){
     
    		$rand = mt_rand(0, count($casPossibles)-1);
     
    		$sortie[] = $casPossibles[$rand];
     
    		unset($casPossibles[$rand]);		
     
    		$casPossibles = array_values($casPossibles );
     
    		$nb--;
    	}
     
    	return $sortie;
     
    }
     
    echo '<pre>';
    print_r(nbAleatoires(10, 275, 369));
    echo '</pre>';

  16. #16
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    j'ai essayer les deux ! c'est kiffe kiffe mais ta version est pas mal car dans ta fonction on peut choisir le depart et tout.

    bien jouer mec !


    j'applaudit la performance =)

  17. #17
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Je te donne même le droit de l'utiliser sans me citer

    PS: y'a surement moyen de l'optimiser, j'ai pas cherché

  18. #18
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Madfrix Voir le message
    Je te donne même le droit de l'utiliser sans me citer
    parfois rester humble c'est beau !

    eh non je préfere utilisé la mienne je sais l'expliquer et elle fonctionne bien

  19. #19
    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
    Elle ne fonctionne pas bien puisque les sorties ne sont pas uniformes.
    Ce n'est pas du vrai hasard.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  20. #20
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    y'a plus simple quand même

    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
    function nbAleatoires($nb, $offsetMin, $offsetMax)
    {
        if($offsetMax < $offsetMin || abs($offsetMax - $offsetMin) < $nb)
        {
            return false;
        }
     
        $range = range($offsetMin, $offsetMax);
     
        shuffle($range);
     
        return array_slice($range, 0, $nb);
    }
     
    echo '<pre>', print_r(nbAleatoires(10, 275, 369), true), '<pre>';

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 10
    Dernier message: 19/01/2012, 12h56
  2. Génération de nombres aléatoires
    Par nono_31 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 05/07/2008, 21h06
  3. défaut des fonctions de génération de nombres aléatoire type rand()
    Par Christophe30 dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 17/02/2008, 20h21
  4. Génération de nombre aléatoires
    Par rebaudo dans le forum Smalltalk
    Réponses: 1
    Dernier message: 29/11/2007, 12h54
  5. recherche algo de génération de nombre aléatoire
    Par Pascale38 dans le forum MFC
    Réponses: 2
    Dernier message: 26/01/2004, 14h20

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