Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, etc. pour PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/04/2011, 10h10   #1
Josselin54
Futur Membre du Club
 
Étudiant
Inscription : janvier 2011
Messages : 53
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 53
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
Josselin54 est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 16/04/2011, 10h17   #2
Madfrix
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 323
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 323
Points : 2 374
Points : 2 374
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
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/04/2011, 10h23   #3
Josselin54
Futur Membre du Club
 
Étudiant
Inscription : janvier 2011
Messages : 53
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 53
Points : 19
Points : 19
Merci pour le in_array() ça marche bien je perd en traitement =) mais dans ce cas foreach ne sers plus a rien =)
Josselin54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 12h44   #4
vorace
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : 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 : 906
Points : 906
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é...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 16/04/2011, 13h33   #5
Josselin54
Futur Membre du Club
 
Étudiant
Inscription : janvier 2011
Messages : 53
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 53
Points : 19
Points : 19
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.
Josselin54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 15h14   #6
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 484
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 484
Points : 21 304
Points : 21 304
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é.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 16/04/2011, 19h07   #7
Josselin54
Futur Membre du Club
 
Étudiant
Inscription : janvier 2011
Messages : 53
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 53
Points : 19
Points : 19
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
Josselin54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 19h53   #8
Josselin54
Futur Membre du Club
 
Étudiant
Inscription : janvier 2011
Messages : 53
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 53
Points : 19
Points : 19
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);
    }
}
Josselin54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 20h09   #9
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 484
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 484
Points : 21 304
Points : 21 304
Si on veut plus de 15 nombres, on tombe dans une boucle infinie.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 16/04/2011, 20h18   #10
Josselin54
Futur Membre du Club
 
Étudiant
Inscription : janvier 2011
Messages : 53
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 53
Points : 19
Points : 19
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 !
Josselin54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 20h28   #11
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 484
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 484
Points : 21 304
Points : 21 304
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.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 20h42   #12
Josselin54
Futur Membre du Club
 
Étudiant
Inscription : janvier 2011
Messages : 53
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 53
Points : 19
Points : 19
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 =)
Josselin54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 21h02   #13
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 484
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 484
Points : 21 304
Points : 21 304
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.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 16/04/2011, 21h06   #14
Josselin54
Futur Membre du Club
 
Étudiant
Inscription : janvier 2011
Messages : 53
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 53
Points : 19
Points : 19
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 =) .
Josselin54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 21h24   #15
Madfrix
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 323
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 323
Points : 2 374
Points : 2 374
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
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/04/2011, 21h33   #16
Josselin54
Futur Membre du Club
 
Étudiant
Inscription : janvier 2011
Messages : 53
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 53
Points : 19
Points : 19
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 =)
Josselin54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 21h35   #17
Madfrix
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 323
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 323
Points : 2 374
Points : 2 374
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
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/04/2011, 21h37   #18
Josselin54
Futur Membre du Club
 
Étudiant
Inscription : janvier 2011
Messages : 53
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 53
Points : 19
Points : 19
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
Josselin54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 22h17   #19
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 484
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 484
Points : 21 304
Points : 21 304
Elle ne fonctionne pas bien puisque les sorties ne sont pas uniformes.
Ce n'est pas du vrai hasard.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 23h36   #20
stealth35
Modérateur
 
Inscription : septembre 2010
Messages : 7 958
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 958
Points : 9 508
Points : 9 508
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>';
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h45.


 
 
 
 
Partenaires

Hébergement Web