Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 25
  1. #1
    Futur Membre du Club
    Étudiant
    Inscrit en
    janvier 2011
    Messages
    56
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2011
    Messages : 56
    Points : 19
    Points
    19

    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 :
    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
    Expert Confirmé 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 532
    Points
    2 532

    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

    ++
    Je ne réponds pas aux questions envoyées par mp

  3. #3
    Futur Membre du Club
    Étudiant
    Inscrit en
    janvier 2011
    Messages
    56
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2011
    Messages : 56
    Points : 19
    Points
    19

    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 émérite Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    août 2010
    Messages
    594
    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 : 594
    Points : 895
    Points
    895

    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
    Futur Membre du Club
    Étudiant
    Inscrit en
    janvier 2011
    Messages
    56
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2011
    Messages : 56
    Points : 19
    Points
    19

    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 Vincent
    Inscrit en
    juillet 2005
    Messages
    21 093
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent

    Informations forums :
    Inscription : juillet 2005
    Messages : 21 093
    Points : 30 705
    Points
    30 705

    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é.

  7. #7
    Futur Membre du Club
    Étudiant
    Inscrit en
    janvier 2011
    Messages
    56
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2011
    Messages : 56
    Points : 19
    Points
    19

    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
    Futur Membre du Club
    Étudiant
    Inscrit en
    janvier 2011
    Messages
    56
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2011
    Messages : 56
    Points : 19
    Points
    19

    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 :
    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 Vincent
    Inscrit en
    juillet 2005
    Messages
    21 093
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent

    Informations forums :
    Inscription : juillet 2005
    Messages : 21 093
    Points : 30 705
    Points
    30 705

    Par défaut

    Si on veut plus de 15 nombres, on tombe dans une boucle infinie.

  10. #10
    Futur Membre du Club
    Étudiant
    Inscrit en
    janvier 2011
    Messages
    56
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2011
    Messages : 56
    Points : 19
    Points
    19

    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 Vincent
    Inscrit en
    juillet 2005
    Messages
    21 093
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent

    Informations forums :
    Inscription : juillet 2005
    Messages : 21 093
    Points : 30 705
    Points
    30 705

    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.

  12. #12
    Futur Membre du Club
    Étudiant
    Inscrit en
    janvier 2011
    Messages
    56
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2011
    Messages : 56
    Points : 19
    Points
    19

    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 Vincent
    Inscrit en
    juillet 2005
    Messages
    21 093
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent

    Informations forums :
    Inscription : juillet 2005
    Messages : 21 093
    Points : 30 705
    Points
    30 705

    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.

  14. #14
    Futur Membre du Club
    Étudiant
    Inscrit en
    janvier 2011
    Messages
    56
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2011
    Messages : 56
    Points : 19
    Points
    19

    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
    Expert Confirmé 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 532
    Points
    2 532

    Par défaut

    Bonjour,

    y'a plus simple quand même

    Code php :
    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>';
    Je ne réponds pas aux questions envoyées par mp

  16. #16
    Futur Membre du Club
    Étudiant
    Inscrit en
    janvier 2011
    Messages
    56
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2011
    Messages : 56
    Points : 19
    Points
    19

    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
    Expert Confirmé 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 532
    Points
    2 532

    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é
    Je ne réponds pas aux questions envoyées par mp

  18. #18
    Futur Membre du Club
    Étudiant
    Inscrit en
    janvier 2011
    Messages
    56
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2011
    Messages : 56
    Points : 19
    Points
    19

    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 Vincent
    Inscrit en
    juillet 2005
    Messages
    21 093
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent

    Informations forums :
    Inscription : juillet 2005
    Messages : 21 093
    Points : 30 705
    Points
    30 705

    Par défaut

    Elle ne fonctionne pas bien puisque les sorties ne sont pas uniformes.
    Ce n'est pas du vrai hasard.

  20. #20
    Modérateur

    Inscrit en
    septembre 2010
    Messages
    7 957
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 7 957
    Points : 10 638
    Points
    10 638

    Par défaut

    y'a plus simple quand même

    Code :
    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •